症狀
當 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 的累積更新中得到修正:
累積更新10 for SQL Server 2014 Service Pack 2
關於 SQL Server 的累積更新
每次 SQL Server 的累積更新都包含了前一個版本中所有的熱修補與安全修補。 請查看 SQL Server 的最新累積更新:
SQL Server 2014 最新累積更新
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。
參考資料
了解 Microsoft 用來描述軟體更新的 術語 。