症狀
假設您在 Microsoft SQL Server 2012 或 SQL Server 2014 中建立一個在資料表變數上使用游標的預存程序。 此外,預存程序會搭配使用 WHERE CURRENT OF 陳述式和游標來更新資料表。
例如,您的預存程序可能類似於:
CREATE PROCEDURE dbo.usp_TestSP AS
BEGIN
DECLARE @TableVar TABLE (SomeInt INT NULL)
INSERT @TableVar VALUES (NULL)
DECLARE @curInt INT, @newInt INT
SET @newInt = 1
DECLARE ccc CURSOR LOCAL FOR
SELECT SomeInt FROM @TableVar WHERE SomeInt IS NULL
OPEN ccc
FETCH NEXT FROM ccc INTO @curInt
UPDATE @TableVar SET SomeInt = @newInt
WHERE CURRENT OF ccc
CLOSE ccc
SELECT * FROM @TableVar
END
當您使用 sp_refreshsqlmodule 系統預存程序執行預存程序時,可能會發生存取違規,而且可能會收到類似下列的錯誤訊息:
注意
Msg 596, Level 21, State 1Cannot continue the execution, because the session is in the kill state.Msg 0, Level 20, State 0 目前的命令發生嚴重錯誤。 如果有結果,應丟棄。
在此情況下,類似下列的錯誤也會寫入 SQL Server 錯誤記錄檔:
注意
date time.730 spid51 SqlDumpExceptionHandler: 處理序 51 已產生嚴重例外狀況 c0000005 EXCEPTION_ACCESS_VIOLATION。 SQL Server 正在終止此程序。
date time.730 SPID51 * *******************************************************************************
date time.730 SPID51 *
DATE TIME.730 SPID51 * 開始堆疊傾印:
Date time.730 SPID51 * 日期時間 SPID 51
date time.730 SPID51 *
date time.730 SPID51 *
date time.730 spid51 * 例外狀況位址 = 00007FFC270236D5 模組 (sqllang+00000000005036D5)
date time.730 spid51 * 例外狀況代碼 = c0000005 EXCEPTION_ACCESS_VIOLATION
date time.730 spid51 * 讀取位址 0000006F00620074 時發生存取違規
date time.730 spid51 * 輸入緩衝區 136 位元組 -
date time.730 spid51 * EXECUTE sp_refreshsqlmodule N'[dbo]。[usp_TestSP]'
date time.730 SPID51 *
date time.730 SPID51 *
解決方式
累積更新資訊
此問題已在下列更新中修正:
- SQL Server 2014 的累積更新 13
- SQL Server 2014 Service Pack 1 (SP1 的累積更新 6)
- SQL Server 2012 Service Pack 3 (SP3 的累積更新 2)
- Microsoft SQL Server 2012 Service Pack 2 (SP2 的累積更新 11)
建議:安裝最新的 SQL Server 累積更新
SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:
- 適用於 SQL Server 2014 的最新累積更新
- SQL Server 2014 SP1 的最新累積更新
- 適用於 SQL Server 2012 SP2 的最新累積更新
- 適用於 SQL Server 2012 SP3 的最新累積更新
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。
參考資料
了解 Microsoft 用來說明軟體更新的術語。