标量 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
最佳答案
是,如果任何参数为NULL<,则指定
.RETURNS NULL ON NULL INPUT
的函数将短路
documentation确实表明了这一点,尽管还不清楚并且似乎仅指 CLR 函数。 (我认为这是 Microsoft 试图澄清 CREATE FUNCTION
中指定的 NULL
行为将覆盖 CLR 方法上的 OnNullCall
属性。)
我已经在 SQL2005 和 SQL2008 中使用非 CLR 函数对此进行了测试,并且它完全按照预期短路。
关于sql-server - MSSQL 上标量 UDF 中的 NULL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/553515/