Blog Stats
  • Posts - 7
  • Articles - 0
  • Comments - 45
  • Trackbacks - 3

 

Thursday, May 21, 2009

SQL Server table function e i default parameter

Oggi mi è capitata una cosa nuova. Ho creato in sql server una table-valued function con un parametro di tipo datetime. Nel parametro ho impostato il default a GETDATE in modo che se un client chiama la funzione con il default viene impostato la data corrente.

La function è fatta grosso modo così:

CREATE FUNCTION MyFunction
(
    @DataValidita AS DATETIME = GETDATE
)
RETURNS TABLE
AS
RETURN
(
    SELECT 
        T.Colonna
        
    FROM
        dbo.Tabella T
        
    WHERE
        T.DataValidita = @DataValidita
)

Mentre la chiamata cosà:

SELECT * FROM dbo.MyFunction(default);

Ma mentre nel primo caso, cioè nella creazione della function, sql server non mi ritorna errori, nel secondo caso, cioè nella chiamata, mi comunica in modo categorico che:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting datetime from character string.

Questo è dovuto al fatto che il parametro @DataValidita assume un valore particolare che non mi è chiaro. Se però eseguo la chiamata con un valore, allora tutto va a buon fine. Dopo qualche ricerca ho capito che nelle function non è possibile utilizzare funzioni non deterministiche come appunto risulta essere GETDATE per i valori di default di un parametro. Dato che la valorizzazione alla data corrente per il parametro @DataValidita è un requisito nel caso in cui la funzione sia chiamata con il default mi sono inventato una soluzione alternativa, in questo modo:

CREATE FUNCTION MyFunction
(
    @DataValidita AS DATETIME = NULL
)
RETURNS TABLE
AS
RETURN
(
    SELECT 
        T.Colonna
        
    FROM
        dbo.Tabella T
        
    WHERE
        T.DataValidita = CASE 
                            WHEN (@DataValidita IS NULL) THEN GETDATE()
                            ELSE @DataValidita
                         END
)

Probabilmente non è la soluzione più elegante, ma questo piccolo trucchetto mi ha risolto il problema. Domanda, esistono soluzioni alternative e magari più eleganti?

Technorati Tags:

 

 

Copyright © Massimo Oliviero