KB4538581 - FIX:2019 年 10 月中标量 UDF SQL Server问题

症状

User-Defined Transact-SQL 中实现的 (函数) UDF 和返回单个数据值的 UDF 称为 T-SQL 标量 User-Defined Functions (UDF) 。 

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

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

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

  • 从 2019 CU2 sp_executesql UDF (会中止Microsoft SQL Server执行)

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

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

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

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

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

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

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

  • 当视图调用添加到 Microsoft SQL Server 2019 CU9 (内联 UDF 时)

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

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

  • 内联 UDF 包含可能导致 2019 CU9 (2019 CU9 Microsoft SQL Server计划程序错误)  

  • 内存不足错误,因为 Microsoft SQL Server 2019 CU9 中已添加条件块中的同一变量 (标量操作)

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

  • 例如,如果 UDF 引用某些 (函数,@@ROWCOUNT) 2019 CU2 (内联函数Microsoft SQL Server更改结果)

  • 将聚合函数作为参数传递给 (2019 CU2 Microsoft SQL Server添加的标量 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" (1)

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

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

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

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

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

  • 如果 UDF 调用查询使用 Microsoft SQL Server 2019 CU6 中添加的 GROUPING SETS、CUBE 或 ROLL (UP)

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

升级到 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 内联性。

状态

Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。

解决方案

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

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

参考

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

需要更多帮助?

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

此信息是否有帮助?

谢谢您的反馈意见!

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

×