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

从 ms 访问调用标量 UDF 函数

将多个表中的多行用于具有标量 UDF 的持久计算列

MS SQL Server 中的标量 UDF 在查询中仅返回一个值

sqlserver 标量函数例子

SQL CLR标量UDF中的DES解密不起作用