8

如果参数为空,则标量 UDF(请参阅CREATE FUNCTION )的选项“RETURNS NULL ON NULL INPUT”会停止执行函数体并简单地返回 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
4

2 回答 2

10

是的,如果它的任何参数是,指定的函数RETURNS NULL ON NULL INPUT将短路。NULL

文档确实建议了这一点,尽管它不清楚并且似乎仅指 CLR 函数。(我认为这是微软试图澄清在中NULL指定的行为CREATE FUNCTION将覆盖OnNullCallCLR 方法上的属性。)

我已经在 SQL2005 和 SQL2008 中使用非 CLR 函数对此进行了测试,它的短路完全符合预期。

于 2009-02-17T10:00:35.877 回答
2

有谁知道它如何处理多个参数?

您的链接中的解释是否足够,或者您是否正在寻找不同的方法?

如果在 CLR 函数中指定了 RETURNS NULL ON NULL INPUT,则表明当它接收的任何参数为 NULL 时,SQL Server 可以返回 NULL,而无需实际调用函数体

于 2009-02-16T15:06:44.217 回答