Sign in with Microsoft
Sign in or create an account.
Hello,
Select a different account.
You have multiple accounts
Choose the account you want to sign in with.

徵兆

User-Defined 函數 (在 Transact-SQL 中實作且傳回單一數據值的 UDF) 稱為 T-SQL Scalar User-Defined 函數 (UDFs) 。 

Microsoft SQL Server 2019 推出 Scalar UDF Inlining 功能。 此功能可以改善呼叫 T-SQL Scalar UDFs 的查詢效能,其中 UDF 執行是主要瓶頸。 T-SQL Scalar UDF Inlining 會自動將內嵌 UDF 轉換成關係型表達式。 

針對使用 Scalar UDF Inlining 的查詢可能會傳回錯誤訊息或非預期的結果,此累積更新 (CU) 包含下列各區域的數個 修正

  • 如果UDF的傳回類型是 SQL Server 2019 CU2) 中新增的 sql_variant (,就會發生類型不相符的錯誤。

  • 從 SQL Server 2019 CU2) 新增的 UDFsp_executesql取消執行 (。

  • 參照標籤但不含相關聯 GOTO 命令的 UDF 會傳回 (在 SQL Server 2019 CU2) 中新增的錯誤結果。

  • 記憶體不足狀況和記憶體洩漏的發生原因是在 SQL Server 2019 CU2 () 中新增了非常大的刻度 UDFs) 。

  • 在條件 (IF-ELSE) 語句中使用的未初始化變數會造成錯誤 (新增至 SQL Server 2019 CU2) 。

  • 如果 UDF 在 SQL Server 2019 CU7) 中新增 sql_variant參數 (,就會發生明確轉換錯誤。

  • 如果在 SQL Server 2019 CU7) 中新增 CHECKSUM(的刻度函數參照,就會發生錯誤。

  • 在 SQL Server 2019 CU7) 中新增許多縮放運算式重新評估的 UDF 語句可能會導致非收益的排程器錯誤 (。

    注意:這個問題的修正程式有時可能會導致效能回歸。 若要降低此效能回歸,您可以開啟追蹤標幟 (TF) 13156 來停用原始修正程式。

    Microsoft 正著手修正此效能回歸問題,並在未來的 CU 中提供。

  • 如果 UDF 參照查詢使用在 SQL Server 2019 CU7) 中新增的 OPTION (RECOMPILE)(,就會發生錯誤。

  • 如果在 SQL Server 2019 CU9) 中新增了叫用內嵌 UDF 的檢視 (,就會發生許可權錯誤。

  • 如果使用query_tsql_scalar_udf_inlinedXEvent (在 SQL Server 2019 CU9) 中新增,就會發生違反存取權的情況。

  • 發生不一致的行為是因為 Scalar UDF Inlining 不尊重 SQL Server 2019 CU9) 中新增的 QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n查詢提示 (。

  • 內嵌 UDF 包含匯總,可能會在 SQL Server 2019 CU9) 中新增 (可能導致非收益的排程器錯誤。

  • 因為在 SQL Server 2019 CU9) 中新增之條件區塊 (相同變數上,發生記憶體不足的錯誤。

  • 升級至 CU9 之後,如果物件叫用的縮放式無線 UDF (UDF1) 具有可縮放式 UDF (UDF2) 做為 SQL Server 2019 CU11) 中新增的輸入參數 (,則會發生存取違規。

  • 在 SQL Server 2019 CU11) 中加入內文 UDF 可能會造成錯誤,併產生錯誤碼 6846、1011 和 107 (。

  • 以非 sysadmin 帳戶執行的內建 UDF 可能會傳回錯誤訊息:「目前命令發生嚴重錯誤。  SQL Server 2019 CU16 () 中新增的結果,如果有的話,應該要捨棄」。

  • 如果使用在 Microsoft SQL Server 2022 CU1 和 SQL Server 2019 CU19) 中新增的同義字 (在 UDF 內叫用暫存數據表,就會發生存取違規。

  • 如果 UDF 定義只包含 GOTO 標籤和 SQL Server 2022 CU1 和 SQL Server 2019 CU19) (新增的RETURN 語句,就會發生存取違規。

  • SQL Server 2022 CU3 和 SQL Server 2019 CU20 () 中新增的 Scalar UDF Inlining 功能開啟時,Scalar UDF 會傳回不同的日期和時間格式。

  • 如果具有 GROUP BY 子句的查詢在 SELECT 語句中使用內嵌 UDF,而沒有在 SQL Server 2022 CU12 和 SQL Server 2019 CU26) 中新增匯總 (函數,就會產生轉儲檔案。

  • 開啟 Scalar UDF Inlining 功能時,發生錯誤「巢狀層級上限超過 (限制 32) 」,即使巢狀層級未超過 (SQL Server 2022 CU12 和 SQL Server 2019 CU26) 中新增的巢狀層級也一樣。

  • 如果已在 SQL Server 2022 CU12 和 SQL Server 2019 CU26) 中新增 (開啟 Scalar UDF Inlining 功能, sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf 中就會發生記憶體損毀。

此累積更新也會 下列案例中封鎖內置:

  • 例如,如果 UDF 參照 (某些內嵌函數, @@ROWCOUNT) 可能會在 SQL Server 2019 CU2) 中新增 UDF 內嵌 (時改變結果。

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

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

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

  • 如果 UDF 包含使用ORDER BY子句但未 TOP 1(在 SQL Server 2019 CU4) 中新增的 SELECT語句。

  • 例如,如果SELECT 語句會與 ORDER BY 子句一起執行作業 (, SELECT @x = @x +1 FROM table ORDER BY column_name) (在 SQL Server 2019 CU4) 中新增。

  • 如果 UDF 包含 (在 SQL Server 2019 CU5) 中新增的多個 RETURN 語句。

  • 如果從 RETURN 語句撥打 UDF, (在 SQL Server 2019 CU5) 中新增。

  • 如果 UDF 參照 SQL Server 2019 CU5) 中新增的 STRING_AGG 函數 (。

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

  • 如果 UDF 通話查詢使用 SQL Server 2019 CU6) 中新增的 GROUPING SETSCUBEROLLUP (。

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

  • 如果 UDF 參照加密的欄 (在 SQL Server 2019 CU11) 中新增。

  • 如果 UDF 包含在 SQL Server 2019 CU11) 中新增的 WITH XMLNAMESPACES(參照。

  • 如果叫用 UDF 的查詢有在 SQL Server 2019 CU11) () 中新增 (CTEs) 的通用數據表表達式。

  • 如果 UDF 定義包含臨時表格的臨時表格或同義字, (在 SQL Server 2022 CU1 和 SQL Server 2019 CU19) 中新增。

  • 如果 UDF 定義具有SELECT語句,以及在 SQL Server 2022 CU4 和 SQL Server 2019 CU20) 中新增的多個工作分派 (欄DISTINCT子句。

  • 如果 UDF 包含使用 TABLESAMPLE PERCENT 子句的 SELECT 語句,以及在 SQL Server 2022 CU7) 中新增的多個變數指派 (。

  • 如果索引檢視所參照的數據表上存在 INSERT 查詢,該數據表包含在 SQL Server 2022 CU12 和 SQL Server 2019 CU26) 中新增的 UDF (。

升級至 SQL Server 2019 CU2 之後,但在升級至 SQL Server 2019 CU5 之前,您應該重新評估 UDF 是否符合輸入的資格。 若要這麼做,請透過下列其中一種方法重新整理合格的縮放UDF:

下列命令會產生腳本,以重新整理任何現有內嵌縮放 UDF 的元資料:

/*

Generates a script that can be used to refresh all active inlineable scalar UDFs.

Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.

*/

SELECT '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

注意:在您升級至 SQL Server 2019 CU5 之後,我們會在編譯期間繼續自動衍生 UDF 內嵌性。

解決方案

此問題已在下列 SQL Server 累積更新中修正:

每個 SQL Server 的新累積更新都包含所有 Hotfix 以及先前累積更新隨附的所有安全性修正。 檢視 SQL Server 的最新累積更新:

狀態

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

參考

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

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?
By pressing submit, your feedback will be used to improve Microsoft products and services. Your IT admin will be able to collect this data. Privacy Statement.

Thank you for your feedback!

×