KB3138930 - 修正:當您執行在 SQL Server 中的資料表變數上使用游標的預存程序時,發生存取違規

Applies To
SQL Server 2012 Service Pack 3 SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

症狀

假設您在 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 累積更新

SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:

      

狀態

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

參考資料

了解 Microsoft 用來說明軟體更新的術語。