标量UDF的选项“RETURNS NULL ON NULL INPUT”(参见CREATE FUNCTION)如果参数为null并且只返回NULL,则会停止执行函数体。
也就是说,它会短路。
有谁知道它如何处理多个参数?
使用多个参数短路一个函数调用会很有用,比如说第一个函数调用至少为NULL。
当我有时间时,我将使用探查器来尝试跟踪udf调用。 我搜索过但找不到任何东西..我可能没有使用过正确的搜索字词。
与此同时,有没有人有任何想法或经验?
来自其他RDBMS世界的答案也是受欢迎的......这是一个ANSI设置,我在搜索中看到了DB2和MySQL的结果
根据评论进行编辑:仅适用于非CLR功能
干杯 小号
编辑: 我不需要运行探查器。卫生署! 这表明了这种行为:
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
答案 0 :(得分:9)
是,如果任何参数为RETURNS NULL ON NULL INPUT
,则指定NULL
的函数会短路。
documentation确实暗示了这一点,虽然它不清楚,似乎只是指CLR功能。 (我认为这是微软试图澄清NULL
中指定的CREATE FUNCTION
行为将覆盖CLR方法的OnNullCall
属性。)
我已经在SQL2005和SQL2008中使用非CLR函数对其进行了测试,并且它与预期完全短路。
答案 1 :(得分:2)
有谁知道它如何处理多个参数?
您的链接中的说明是否足够,或者您是否在寻找不同的内容?
如果NULL INPUT为RETURNS NULL,则为 它在CLR函数中指定 表示SQL Server可以返回 当任何参数时它为NULL 接收是NULL,实际上没有 调用函数体