none
funzione scalare RRS feed

  • Domanda

  • ciao.

    Vorrei scrivere una funzione scalare che mi ritorna il valore restituito da questa queri.

    Ma non riesco ad inserirlo nel corpo della definizione della funzione ...come posso fare?

     

    WITH

     

    Giorni AS

    (

     

    SELECT CONVERT(Datetime,CONVERT(CHAR(8),GETDATE(),112)) AS Giorno

     

    UNION ALL

     

    SELECT Giorno+1

     

    FROM Giorni

     

    WHERE Giorno -31 < CONVERT(Datetime,CONVERT(CHAR(8),GETDATE(),112)) - datepart(day,getdate())

    )

    SELECT

     

    count

     

    (giorno ) as GiorniLavorativiMancantiFineMese

    from

     

    giorni

    WHERE

     

    Datepart(dw,giorno) NOT IN (6,7)

     

     

    Marco

    giovedì 1 aprile 2010 09:42

Risposte

  • Vorrei scrivere una funzione scalare che mi ritorna il valore restituito da questa queri.

    Ma non riesco ad inserirlo nel corpo della definizione della funzione ...come posso fare?

    Ciao Marco,

    Occhio che quella condizione di WHERE restituisce anche il primo maggio che cadendo di sabato viene escluso dal filtro applicato alla query esterna alla CTE.
    Ho rivisto la tua query utilizzando il data type date introdotto con SQL Server 2008:

    USE tempdb;
    GO
    
    CREATE FUNCTION dbo.udf_GetLastWorkingDays()
    RETURNS int
    BEGIN
        DECLARE @LastWorkingDays int = 0;
    
        WITH CTE_Giorni AS
        (
            SELECT CAST(CURRENT_TIMESTAMP AS date) AS Giorno 
            UNION ALL
            SELECT DATEADD(day, 1, Giorno)
            FROM CTE_Giorni 
            WHERE Giorno < DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP) + 1, -1)
        )
        SELECT @LastWorkingDays = COUNT(*)
        FROM CTE_Giorni
        WHERE DATEPART(weekday, Giorno) NOT IN (6, 7);
        
        RETURN @LastWorkingDays;
    END
    GO
    
    SELECT dbo.udf_GetLastWorkingDays() AS GiorniLavorativiMancantiFineMese;
    
    /* Output:
    
    GiorniLavorativiMancantiFineMese
    --------------------------------
    21
    
    (1 row(s) affected)
    
    */
    
    DROP FUNCTION dbo.udf_GetLastWorkingDays;

     

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit

    • Contrassegnato come risposta teguria giovedì 6 maggio 2010 13:21
    giovedì 1 aprile 2010 12:48
    Moderatore