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