KB4538581 - 修复:2019 年 10 月中标量 UDF 内联SQL Server问题

症状

User-Defined Transact-SQL 中实现的 (UDF) 函数函数称为 T-SQL Scalar User-Defined Functions (UDF) 。 

Microsoft SQL Server 2019 年 10 月推出了标量 UDF 内联功能,可改善调用 T-SQL 标量 UDF 的查询的性能,其中 UDF 执行是主要瓶颈。 T-SQL标量 UDF 内联会自动将内联 UDF 转换为关系表达式。 


对于使用标量UDF 内联的查询可能返回错误或意外结果的情况,此累积更新包括以下多个修补程序:

  • 如果 UDF 的返回类型为 2019 CU2 sql_variant (2019 CU2 Microsoft SQL Server类型不匹配)

  • 从 2019 CU2 sp_executesql UDF 调用会中止 (2019 CU2 Microsoft SQL Server中添加)

  • 引用标签但不使用关联的 GOTO 命令的 UDF 返回错误的结果 (2019 CU2 Microsoft SQL Server 2019 CU2)

  • 由于 2019 CU2 (中添加了非常大的标量 UDF,Microsoft SQL Server和内存泄漏)

  • IF-ELSE) 语句 (条件中使用的未初始化变量 (导致错误Microsoft SQL Server 2019 CU2)

  • 如果 UDF 在 2019 CU7 SQL中添加了 (_VARIANT 参数Microsoft SQL Server显式转换)

  • 在 2019 CU7 (中添加标量函数引用 CHECKSUM Microsoft SQL Server时引发)

  • 使用大量标量表达式重新评估的 UDF 调用可能导致在 (2019 CU7 Microsoft SQL Server添加非生成计划程序错误)

  • 当 UDF 引用查询使用 OPTION (RECOMPILE) (2019 CU7 Microsoft SQL Server时)

  • 在 2019 CU9 中添加的视图调用内 (UDF 时Microsoft SQL Server权限)

  • 使用 2019 CU9 query_tsql_scalar_udf_inlined (2019 CU9 Microsoft SQL Server XEvent 时发生的访问)  

  • 由于标量 UDF 内联不遵循 QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n 2019 CU9 (中添加的"Microsoft SQL Server"查询提示)

  • 内联 UDF 包含的聚合可能会导致在 Microsoft SQL Server 2019 CU9 中 (计划程序错误)  

  • 由于在 2019 CU9 Microsoft SQL Server中添加的条件块中对同一变量执行一系列标量操作 (内存不足)

  • 当对象调用具有标量内联 UDF (UDF1) 的标量内联 UDF (UDF2) ,该 UDF2 在升级到 Microsoft SQL Server 2019 CU11 (后用作输入参数时,可能会发生访问冲突)

  • 内联 UDF 可能会导致错误,错误代码 6846、1011 和 107 (添加到 Microsoft SQL Server 2019 CU11)


此累积 更新还会阻止以下情况下的内向:

  • 例如,如果 UDF (某些内部函数,@@ROWCOUNT) 2019 CU2 函数中添加内联函数 (更改Microsoft SQL Server函数)

  • 将聚合函数作为参数传递给 2019 CU2 (2019 CU2 Microsoft SQL Server scalar UDF)

  • 如果 UDF 引用内置视图 (例如:OBJECT_ID) (2019 CU2 Microsoft SQL Server中添加)

  • 如果 UDF 使用 XML 方法 (2019 CU4 Microsoft SQL Server中添加)

  • 如果 UDF 包含 SELECT with ORDER BY 且未在 Microsoft SQL Server 2019 CU4 ("TOP 1")

  • 例如,如果 SELECT 查询与 ORDER BY 子句 (一起执行分配,则 SELECT @x = @x +1 FROM 表 ORDER BY column_name) (添加到 Microsoft SQL Server 2019 CU4)

  • 如果 UDF 包含多个 RETURN 语句, (2019 CU5 Microsoft SQL Server中添加)

  • 如果从 RETURN 语句调用 UDF, (2019 CU5 Microsoft SQL Server添加)

  • 如果 UDF 引用 STRING_AGG 函数 (2019 CU5 Microsoft SQL Server添加)

  • 如果 UDF 定义引用远程表 (2019 CU6 Microsoft SQL Server添加)

  • 如果 UDF 调用查询使用 GROUPING SETS、CUBE 或 ROLLUP (添加到 Microsoft SQL Server 2019 CU6)

  • 如果 UDF 调用查询包含一个变量,用作分配 (的 UDF 参数,例如,SELECT @y=2、@x=UDF (@y) ) (添加到 Microsoft SQL Server 2019 CU6)

  • 如果 UDF 引用加密列 (2019 CU11 Microsoft SQL Server 2019 中)

  • 如果 UDF 包含对 2019 CU11 (中添加Microsoft SQL Server XMLNAMESPACES")

  • 如果调用 UDF 的查询在 (2019 CU11) (C CTES Microsoft SQL Server通用表)


升级到 2019 CU2 Microsoft SQL Server升级到 CU5 之前,应重新评估 UDF 是否符合内联条件。 为此,请通过以下方法之一刷新符合条件的标量 UDF:

以下脚本生成一个脚本来刷新现有内联标量 UDF 的元数据:

/*

生成可用于刷新所有活动内联标量 UDF 的脚本。

备注 sp_refreshsqlmodule命令不会影响任何权限、扩展属性、

或与 对象关联的 SET 选项。

*/

选择"EXECUTE sys.sp_refreshsqlmodule''[' + OBJECT_SCHEMA_NAME (object_id) + +'].' + '[' + OBJECT_NAME (object_id)

+ ']'';'AS "RefreshStatement"

FROM sys.sql_modules

WHERE is_inlineable = 1

AND inline_type = 1;

GO

备注 升级到 2019 CU5 Microsoft SQL Server,我们将在编译期间自动派生 UDF 内联性。

解决方法

以下累积更新中修复了此问题,SQL Server:

每个新的累积更新SQL Server包含所有修补程序以及上一个累积更新中包含的所有安全修补程序。 查看最新累积更新,了解SQL Server:

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

参考

了解 Microsoft 用于描述软件更新的术语

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×