KB4058565- 修正:在 2014、2016 及 2017 SQL Server 執行參考大型物件的儲存程序時,斷言錯誤

套用到
SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows SQL Server 2016 Service Pack 1 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)

症狀

當 Microsoft SQL Server 反覆執行執行以下操作的儲存程序時,可能會發生斷言錯誤:

  • 取一個大物件,例如 varchar (max) varbinary (max) ,作為參數,且
  • 建立一個暫存資料表,作用範圍為程序執行範圍,且
  • 在暫存資料表中使用 large object 參數。

您可以在 SQL Server 錯誤日誌中找到類似的斷言錯誤:

日期/時間 SPID 錯誤:17065,嚴重程度:16,狀態:1。

日期/時間 SPID SQL Server 斷言:檔案:FilePath\FileName,行 = 行號 斷言失敗 = 'fFalse' 嘗試存取過期的 blob handle (1) 。 這個錯誤可能與時間有關。 若重執行該陳述式後錯誤依舊,請使用 DBCC CHECKDB 檢查資料庫結構完整性,或重啟伺服器以確保記憶體內的資料結構未損壞。

日期/時間 SPID 錯誤:3624,嚴重程度:20,狀態:1。

日期/時間 SPID 系統斷言檢查失敗。 詳情請查看 SQL Server 錯誤日誌。 通常,斷言失敗是由軟體錯誤或資料損壞所引起。 要檢查資料庫損壞,請考慮執行 DBCC CHECKDB。 如果你在設定時同意將資料轉印寄給 Microsoft,則會寄出一個迷你轉印給 Microsoft。 更新可能由 Microsoft 提供於最新的服務包,或技術支援的熱修補程式。

原因

SQL Server 內部邏輯可關閉參考大型物件的查詢快取,避免後續執行中引用 (先前執行時建立、因此對後續執行無效的 LOB,) 。 但這種邏輯無法處理延遲 名稱解析 (DNR) 在臨時資料表上導致這些計畫被快取的情況。 有作用域的暫存資料表建立成本高昂,SQL Server 會快取它們以便在後續執行中重複使用。 這可防止因結構變更而重新編譯此類查詢。

了解更多關於 延期命名決議的資訊。

解決方式

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

累積更新8 for SQL Server 2016 SP1

累積更新4 for SQL Server 2017

累積更新10 for SQL Server 2014 Service Pack 2

關於 SQL Server 的累積更新

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

SQL Server 2016 最新累積更新

SQL Server 2017 最新累積更新

SQL Server 2014 最新累積更新

狀態

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

參考資料

了解 Microsoft 用來描述軟體更新的 術語