症状
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:
-
运行 sp_refreshsqlmodule 标量 UDF (请参阅 sp_refreshsqlmodule (Transact-SQL) , 了解有关此系统存储过程的详细信息)
-
使用现有定义、权限和设置属性更改或重新创建现有标量 UDF, (ALTER FUNCTION (Transact-SQL) )
以下脚本生成一个脚本来刷新现有内联标量 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包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看最新累积更新,了解SQL Server:
参考
了解 Microsoft 用于描述软件更新的术语。