NULL-параметры в скалярных UDF на MSSQL - PullRequest
6 голосов
/ 16 февраля 2009

Опция «ВОЗВРАЩАЕТ ПУСТО (NULL ON NULL INPUT») для скалярной UDF (см. CREATE FUNCTION ) останавливает выполнение тела функции, если параметр имеет значение NULL, и просто возвращает NULL.

То есть это короткие замыкания.

Кто-нибудь знает, как он обрабатывает несколько параметров?

Было бы полезно замкнуть вызов функции с несколькими параметрами, скажем, если первый из них по крайней мере равен NULL.

Когда у меня будет время, я буду использовать профилировщик, чтобы попытаться отследить вызовы udf. Я искал, но ничего не могу найти ... скорее всего, я не использовал правильные условия поиска.

А пока у кого-нибудь есть идеи или опыт?

Приветствуются также ответы из других миров RDBMS. Это параметр ANSI, и я видел результаты для DB2 и MySQL в своих поисках

Редактирование на основе комментария: только для не-CLR функций

Приветствие S

Edit: Мне не нужно запускать профилировщик. Doh! Это демонстрирует поведение:

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

Ответы [ 2 ]

9 голосов
/ 17 февраля 2009

Да , функция, которая задает RETURNS NULL ON NULL INPUT, замкнется, если любой ее параметров равен NULL.

Документация действительно предлагает это, хотя это неясно и, по-видимому, относится только к функциям CLR. (Я думаю, что это попытка Microsoft пояснить, что поведение NULL, указанное в CREATE FUNCTION, переопределит атрибут OnNullCall в методе CLR.)

Я проверил это с не-CLR функциями в SQL2005 и SQL2008, и оно закорачивается точно так, как и ожидалось.

2 голосов
/ 16 февраля 2009

Кто-нибудь знает, как он обрабатывает несколько параметров?

Достаточно ли объяснения в вашей ссылке, или вы искали другой вариант?

Если RETURNS NULL ON NULL INPUT указанный в функции CLR, это указывает, что SQL Server может вернуть NULL, когда любой аргументов получает NULL, без собственно вызывая тело функции

...