sql-server - MSSQL 上标量 UDF 中的 NULL 参数

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

最佳答案

,如果任何参数为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/

相关文章:

sql - 在具有 UNION 的查询中使用 OVER()

sql-server - 将 utf-8 编码的 varbinary(max) 数据转换为 nvarchar(max) 字符串

python - 将列表列表分为两部分的好方法,以内部列表中的值为条件

python - 接收未知列数的 Spark UDF

Excel 编程方法

mysql - 如何将一列中的所有行求和到两个连接表中?

python - 如何使用 Python 3 访问 MS SQL Server?

c++ - 是否存在程序员可能希望避免 bool 表达式的短路求值的合理场景?

c# - 为什么 `bool?` 上没有解除短路运算符?

sql-server-2008 - SQL 服务器 (T-SQL) : Avoid call scalar function multiple times