KB4538581 - 修正:SQL Server 2019 中的 Scalar UDF 嵌入式問題

徵狀

User-Defined (在 Transact-SQL 中) 且會返回單一資料值的 UDF 函數User-Defined稱為 T-SQL Scalar User-Defined UDF (UDF) 。 

Microsoft SQL Server 2019 引進了 Scalar UDF Inlining 功能,可改善啟動 T-SQL Scalar UDF 的查詢的績效,其中 UDF 執行是主要的瓶頸。 T-SQL Scalar UDF Inlining 會自動將內嵌 UDF 轉換成關聯式運算式。 
 

對於使用 Scalar UDF Inlining 的查詢可能會返回錯誤或意外結果的情況,此累加更新包含下列各項的數個修正:

  • 如果 UDF 的返回類型是 Microsoft SQL Server 2019 CU2 SQL_variant (中新增的,則輸入不)

  • 從 microsoft SQL Server 2019 CU2 sp_executesql中 (新增的 UDF sp_executesql中止執行)

  • 參照沒有相關 GOTO 命令之標籤的 UDF 會 (Microsoft SQL Server 2019 CU2 中新增的不正確)

  • 在 Microsoft SQL Server 2019 CU2 中新增了 (量 UDF,造成記憶體不足和記憶體外泄)

  • 用於條件 if-ELSE (語句中的未初始化) 會造成錯誤 (Microsoft SQL Server 2019 CU2)

  • 如果 UDF 在 Microsoft SQL Server 2019 CU7 SQL_VARIANT中新增 (參數,則明確轉換錯誤)

  • 當純量函數參照 MICROSOFT SQL Server 2019 CU7 (CHECKSUM 時發生錯誤)

  • 在 Microsoft SQL Server 2019 CU7 中加入大量量運算式的 UDF 重新評估可能會導致非收益排程器錯誤 (在 Microsoft SQL Server 2019 CU7)

  • 當 UDF 參照查詢使用 MICROSOFT SQL Server 2019 CU7 (中新增的 OPTION) (RECOMPILE 時發生錯誤)

  • 在 Microsoft SQL Server 2019 CU9 (中新增內聯 UDF 時,許可權錯誤)

  • 使用 Microsoft SQL Server 2019 CU9 query_tsql_scalar_udf_inlined (中新增的 XEvent 帳戶時發生的存取衝突)  

  • 由於 Scalar UDF Inlining 不尊重 Microsoft SQL Server 2019 CU9 QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n 中新增的 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 查詢提示 (導致不一致的行為)

  • 內聯 UDF 包含可能會導致非收益排程器錯誤的匯總 (Microsoft SQL Server 2019 CU9)  

  • 在 Microsoft SQL Server 2019 CU9 (中新增的條件區塊中,相同變數的一系列清除量作業導致記憶體不足)

此累加 更新也會在下列情況下阻止內線:

  • 例如,如果 UDF 參照 (函數,@@ROWCOUNT) Microsoft SQL Server 2019 CU2 中新增內 (可能會變更結果)

  • 當匯總函數以參數形式傳遞至 Microsoft SQL Server 2019 CU2 (中新增的 scalar UDF)

  • 例如,如果 UDF 參照內建 (:OBJECT_ID) (Microsoft SQL Server 2019 CU2 中新增)

  • 如果 UDF 使用在 Microsoft SQL Server 2019 CU4 (中新增的 XML 方法)

  • 如果 UDF 包含含有 ORDER BY 的 SELECT,但沒有在 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 語句, (Microsoft SQL Server 2019 CU5)

  • 如果 UDF 是從在 Microsoft SQL Server 2019 CU5 (中新增的 RETURN 語句)

  • 如果 UDF 參照 STRING_AGG Microsoft SQL Server 2019 CU5 (新增的)

  • 如果 UDF 定義參照遠端資料表 (Microsoft SQL Server 2019 CU6 中新增)

  • 如果 UDF 通話查詢使用 MICROSOFT SQL Server 2019 CU6 (中新增的 GROUPING 集、CUBE 或 ROLLUP)

  • 如果 UDF 呼叫查詢包含做為工作分派 (UDF 參數的變數,例如 select @y=2,@x=UDF (@y) ) (新增到 Microsoft SQL Server 2019 CU6)

升級至 Microsoft SQL Server 2019 CU2 之後,但在升級至 CU5 之前,您應重新評估 UDF 是否符合內聯資格。 若要這麼做,請透過下列其中一種方法重新組織符合資格的 scalar UDF:

下列腳本會產生腳本,以重新更新現有內建的 scalar UDF 的中繼資料:
 

/*

產生可用來重新更新所有使用中可內嵌 Scalar 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;

附註: 升級到 Microsoft SQL Server 2019 CU5 之後,我們會再次在編譯期間自動推匯出 UDF 的內嵌性。

狀態

Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。

解決方案

這個問題在 SQL Server 的下列累積更新中已經修正:

SQL Server 的每個新累積更新都包含所有 Hotfix,以及上一個累積更新中包含的所有安全性修正。 查看 SQL Server 的最新累積更新:

參考

了解 Microsoft 用來說明軟體更新的術語

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與我們的其中一個 Office 支援專員連絡以深入了解您的意見。

×