MSSQL 上标量 UDF 中的 NULL 参数
Posted
技术标签:
【中文标题】MSSQL 上标量 UDF 中的 NULL 参数【英文标题】:NULL parameters in scalar UDFs on MSSQL 【发布时间】:2010-10-07 21:35:34 【问题描述】:标量 UDF 的“RETURNS NULL ON NULL INPUT”选项(请参阅CREATE FUNCTION)在参数为 null 时停止执行函数体并简单地返回 NULL。
也就是说,它短路了。
有人知道它是如何处理多个参数的吗?
用多个参数短路函数调用会很有用,比如如果第一个参数至少为 NULL。
当我有时间时,我会使用分析器来尝试跟踪 udf 调用。 我已经搜索过,但找不到任何东西。更可能是我没有使用正确的搜索字词。
在此期间,有没有人有任何想法或经验?
也欢迎来自其他 RDBMS 领域的回答。这是一个 ANSI 设置,我在搜索中看到了 DB2 和 mysql 的结果
根据评论编辑:仅适用于非 CLR 函数
干杯 S
编辑: 我不需要运行探查器。嗬! 这展示了这种行为:
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
【问题讨论】:
【参考方案1】:是,如果任何参数为NULL
,则指定RETURNS NULL ON NULL INPUT
的函数将短路。
documentation 确实暗示了这一点,尽管它不清楚并且似乎仅指 CLR 函数。 (我认为这是微软试图澄清CREATE FUNCTION
中指定的NULL
行为将覆盖CLR 方法上的OnNullCall
属性。)
我已经在 SQL2005 和 SQL2008 中使用非 CLR 函数对此进行了测试,它的短路完全符合预期。
【讨论】:
知道有用。我有许多可以从中受益的字符串操作 UDF 在这种情况下应该改进 MSDN 文档,当然!【参考方案2】:有人知道它是如何处理多个参数的吗?
您的链接中的解释是否足够,或者您是否在寻找不同的观点?
如果 RETURNS NULL ON NULL INPUT 是 在 CLR 函数中指定,它 表示 SQL Server 可以返回 当 any 的参数时为 NULL 收到的是NULL,实际上没有 调用函数体
【讨论】:
@gbn: RETURNS NULL ON NULL INPUT 仅适用于 CLR 函数。 我知道单参数非 CLR 会短路。你从哪里得到你的信息?以上是关于MSSQL 上标量 UDF 中的 NULL 参数的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历表的列名并将值传递给 MSSQL while 循环中的 UDF