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: 
SQL Server