MSSQL上标量UDF中的NULL参数

时间:2009-02-16 14:49:54

标签: sql-server short-circuiting user-defined-functions

标量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

2 个答案:

答案 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,实际上没有   调用函数体