Update
SQL Server 2019 UPDATE 語句 SET to function 不會為每一行再次執行該函式
這是場景。我有一個本地 SQL Server,我已將實時 SQL Server 數據庫恢復到該本地 SQL Server。為了符合 GDPR/CCPA,我必須匿名化本地伺服器數據庫中的 PII。我有一個腳本來執行此操作,當本地伺服器是 2008 R2 或 2017 時,它一直執行良好。但我剛剛安裝了 2019,並且相同的腳本在表的每一行中放置了相同的值,而不是不同的值對於每一行。就好像函式只執行一次,然後在
UPDATE
語句中使用該值。也許這是 2019 年正在做的某種優化?這是腳本的一個片段。
UPDATE Guest SET GuestFirstName=Utility.dbo.RANDWORD() WHERE GuestFirstName IS NOT NULL;
RANDWORD
從包含大約 100,000 個英語單詞的表中抓取一個隨機單詞。
我懷疑這是因為 SQL 2019 的一個新功能,標量 UDF 內聯:
使用此新功能,標量 UDF 會自動轉換為標量表達式或標量子查詢,在呼叫查詢中替換 UDF 運算符。然後優化這些表達式和子查詢。因此,查詢計劃將不再具有使用者定義的函式運算符,但其效果將在計劃中觀察到,如視圖或內聯 TVF。
這可能會帶來性能優勢,但在您的情況下,它似乎只處理該函式一次,然後將相同的結果應用於每一行。
連結文章的底部描述了禁用標量 UDF 內聯的幾種方法。
您可以按數據庫禁用它:
ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;
或者使用提示強制此選項逐個查詢:
OPTION (USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING'));
或者您可以通過更改 UDF 本身來禁用它:
WITH INLINE = OFF