KB4013883- 修正:2016 SQL Server 涉及欄位儲存索引查詢時,因篩選條件評估延遲而導致資料型別轉換錯誤

套用到
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

症狀

請考慮以下案例:

  • 你在 Microsoft SQL Server 2016 中使用的相容性等級設為 130 的資料庫。
  • 你執行查詢時會存取欄位儲存索引和列儲存索引或堆積,並且包含一個篩選謂詞 (WHERE 子句) 。

在此情境下,SQL Server無法將濾波器謂詞推近資料來源運算子 (資料表、索引掃描或尋) 。 這可能導致查詢效能不佳。

此外,若查詢使用表達式 (,如類型轉換) ,其正確性依賴於過濾資料 (例如,字元表欄位被轉換成整數,但只有部分值包含有效的整數表示,且該子集由濾波條件) 識別,則查詢可能會因類似以下其中之一的資料轉換錯誤而失敗:

注意

Msg 245,16層,州1,20線
當 varchar 值 '0.5' 轉換成資料型別 int 時,轉換失敗。

Msg 8114,16層,州5,34線
將資料型別 varchar 轉換為 bigint 時出錯。

解決方式

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

        Cumulative Update 2 for SQL Server 2016 SP1

您必須啟用查詢優化器熱修正,才能讓此修正生效。

您可以透過以下選項之一啟用查詢優化器熱修補:trace flag 4199、資料庫範圍設定設定 QUERY_OPTIMIZER_HOTFIXES=ON ((SQL Server 2016 及以後) 可用),或查詢選項「ENABLE_QUERY_OPTIMIZER_HOTFIXES」 (USE_HINT 2016 SP1 及以後版本) SQL Server。

關於 SQL Server 的累積更新

每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 SQL Server 的最新累積更新:

SQL Server 2016 最新累積更新

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

參考資料

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