徵狀
請試想下列案例:
-
您必須使用 [查詢資料存放區] 功能時,Microsoft SQL Server 2016年資料庫。
-
您必須使用 [插入...會另一個預存程序呼叫的預存程序EXEC"的語法。
-
查詢的資料存放區的大小會增加至最大值設定的大小,以及查詢的資料存放區從READ_WRITE狀態變更為READ_ONLY,定期執行自動清除。
在這個案例中,父預存程序執行定期作業失敗,並且您收到類似下列的錯誤訊息:
訊息 556,層次 16,狀態 2,第 5 行插入的 EXEC 失敗,因為預存程序更改目標資料表的結構描述。
原因
查詢的資料存放區執行時自動清理,這會清除的計劃從 [查詢資料存放區。計劃是從 [查詢資料存放區,遺失,但仍然會出現在程序快取的計劃,是因為,查詢會遇到重新編譯作業。根據設計,重新編譯作業發生時,SQL Server 會擲回錯誤 556,以避免重複執行子程序,可能會導致不正確的結果傳回。
因應措施
若要解決這個問題,請依照下列步驟執行:
-
增加查詢的資料存放區的大小。這會降低頻率] 或 [查詢資料存放區清除計劃,輸入 READ_ONLY 操作模式的可能性。
-
將錯誤處理加入您的程式碼,來捕捉錯誤 556,然後再重新送出插入 EXEC 查詢。
-
當查詢資料存放區恢復到READ_WRITE的狀態從READ_ONLY時,請清除程序快取。
其他資訊
在 Microsoft SQL Server 2017年中的 [查詢資料存放區中所做的變更,因為 SQL Server 2017年中沒有發生這個問題。在 SQL Server 2016年,不會修正這個問題。