您有一個預存程式,可使用
INSERT...EXEC
語法呼叫另一個預存程式。
查詢資料存放區功能會定期執行自動清除,因為它會增加到其設定的大小上限。 此外,查詢資料存放區狀態會從
READ_WRITE
變更為
READ_ONLY
。
在此案例中,父預存程式執行會定期失敗,而且您會收到類似下列的錯誤訊息:
Msg 556, Level 16, State 2, Line
LineNumber
INSERT EXEC 失敗,因為預存程式更改了目標資料表的架構。
自動清除程式會將計畫清除出查詢資料存放區。 查詢會遇到重新編譯作業,因為查詢資料存放區遺漏計畫。 不過,計畫仍會出現在程式快取中。 根據設計,當重新編譯作業發生時,SQL Server擲回錯誤 556,以防止副程式重複執行。 這類重複作業會導致傳回不正確的結果。
此問題已在下列 service Pack 中修正SQL Server:
Service Pack 3 for SQL Server 2016
關於適用于 SQL Server 的 Service Pack:
Service Pack 是累積的。 每個新的 Service Pack 都包含先前 Service Pack 中的所有修正,以及任何新的修正程式。 建議您為該 Service Pack 套用最新的 Service Pack 和最新的累積更新。 安裝最新的 Service Pack 之前,您不需要安裝先前的 Service Pack。 如需最新 Service Pack 和最新累積更新的詳細資訊,請參閱下列文章中的表 1:
如何判斷SQL Server及其元件的版本、版本和更新層級
若要避開此問題,請依照下列步驟執行:
增加查詢資料存放區的大小。 這會降低查詢資料存放區清除計畫並進入作業模式的
READ_ONLY
頻率或可能性。
將錯誤處理新增至您的程式碼,以攔截錯誤 556,然後重新提交
INSERT EXEC
查詢。
當查詢資料存放區從
READ_ONLY
返回狀態時,
READ_WRITE
清除程式快取。
由於在 Microsoft SQL Server 2017 中對查詢資料存放區所做的變更,此問題不會在 2017 SQL Server發生。 此問題在 2016 SQL Server無法修正。