2009-02-16 17 views
5

L'opzione "RETURN NULL ON NULL INPUT" per una UDF scalare (vedere CREATE FUNCTION) arresta il corpo della funzione in esecuzione se il parametro è nullo e restituisce semplicemente NULL.Parametri NULL in UDF scalari su MSSQL

Cioè, cortocircuiti.

Qualcuno sa come gestisce più parametri?

Sarebbe utile cortocircuitare una chiamata di funzione con più parametri, ad esempio se il primo è almeno NULL.

Quando ho tempo, userò il profiler per cercare di rintracciare le chiamate udf. Ho cercato ma non riesco a trovare nulla .. più probabilmente potrei non aver usato i termini di ricerca corretti.

Nel frattempo, qualcuno ha qualche idea o esperienza?

Risposte da altri mondi RDBMS sono i benvenuti .. questo è un ambiente ANSI e ho visto risultati per DB2 e MySQL nelle mie ricerche

Modifica, sulla base di un commento: Per le funzioni non-CLR solo

Cheers S

Modifica: Non è necessario eseguire il profiler. Doh! Questo dimostra il comportamento:

CREATE FUNCTION dbo.ufnTest (
    @dummy tinyint 
) 
RETURNS tinyint 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    RETURN 1 
END 
GO 
SELECT dbo.ufnTest(0), dbo.ufnTest(NULL) 
GO 


ALTER FUNCTION dbo.ufnTest (
    @dummy tinyint 
) 
RETURNS tinyint 
--WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    RETURN 1 
END 
GO 
SELECT dbo.ufnTest(0), dbo.ufnTest(NULL) 
GO 


ALTER FUNCTION dbo.ufnTest (
    @dummy tinyint, 
    @dummy2 tinyint 
) 
RETURNS tinyint 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    RETURN 1 
END 
GO 
SELECT dbo.ufnTest(0, 2), dbo.ufnTest(NULL, 2), dbo.ufnTest(0, NULL) 
GO 


ALTER FUNCTION dbo.ufnTest (
    @dummy tinyint, 
    @dummy2 tinyint 
) 
RETURNS tinyint 
--WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
    RETURN 1 
END 
GO 
SELECT dbo.ufnTest(0, 2), dbo.ufnTest(NULL, 2), dbo.ufnTest(0, NULL) 
GO 

risposta

9

, una funzione che specifica RETURNS NULL ON NULL INPUT si corto circuito se qualsiasi della sua pa rami sono NULL.

Il documentation suggerisce questo, anche se non è chiaro e sembra riferirsi solo alle funzioni CLR. (Credo che questo è il tentativo di Microsoft di chiarire che il comportamento NULL specificato nel CREATE FUNCTION sovrascrive l'attributo OnNullCall sul metodo CLR.)

Ho provato questo con le funzioni non-CLR sia in SQL2005 e SQL2008 ed a breve circuiti esattamente come previsto.

+0

Utile da sapere. Ho un numero di UDF di manipolazione delle stringhe che trarrebbero vantaggio da questo – Kristen

+1

La documentazione MSDN dovrebbe essere migliorata in questo caso, di sicuro ! – gotqn

2

Qualcuno sa come si gestisce più parametri?

è la spiegazione nel vostro legame sufficiente, o cercavate un approccio diverso?

Se restituisce NULL ON NULL INPUT è specificato in una funzione CLR, è indica che SQL Server può restituire NULL quando qualsiasi degli argomenti che riceve è NULL, senza in realtà invocare il corpo di la funzione

+0

Per funzioni non CLR ... – gbn

+0

@gbn: RETURN NULL ON NULL INPUT è applicabile solo per le funzioni CLR. – casperOne

+0

Conosco cortocircuiti per singolo parametro non-CLR. Dove ottieni le tue informazioni? – gbn