KB3138930 - CORREÇÃO: Violação de acesso quando você executa um procedimento armazenado que usa um cursor em uma variável de tabela no SQL Server

Aplica-se A
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)

Sintomas

Suponha que você crie um procedimento armazenado que usa um cursor em uma variável de tabela no Microsoft SQL Server 2012 ou SQL Server 2014. Além disso, o procedimento armazenado atualiza a tabela ao utilizar uma instrução WHERE CURRENT OF juntamente com o cursor.

Por exemplo, o seu procedimento armazenado pode ter o seguinte aspeto:

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 

Quando executa o procedimento armazenado utilizando o procedimento armazenado no sp_refreshsqlmodule, poderá ocorrer uma violação de acesso e poderão ser recebidas mensagens de erro semelhantes às seguintes:

Nota

Msg 596, Nível 21, Estado 1Não é possível continuar a execução porque a sessão está no estado matar. Msg 0, Nível 20, Estado 0Ocorreu um erro grave no comando atual. Os resultados, se houver, devem ser descartados.

Nesta situação, os erros semelhantes aos seguintes também são gravados nos registos de erro SQL Server:

Nota

data time.730 spid51 SqlDumpExceptionHandler: Processo 51 gerou exceção fatal c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server está a terminar este processo.
data hora.730 spid51 * *******************************************************************************
data hora.730 spid51 *
data time.730 spid51 * BEGIN STACK DUMP:
data hora.730 spid51 * data hora spid 51
data hora.730 spid51 *
data hora.730 spid51 *
date time.730 spid51 * Exception Address = 00007FFC270236D5 Module(sqllang+0000000005036D5)
date time.730 spid51 * Código de exceção = c0000005 EXCEPTION_ACCESS_VIOLATION
data hora.730 spid51 * Ocorreu violação de acesso endereço de leitura 0000006F00620074
data time.730 spid51 * Buffer de entrada 136 bytes -
data hora.730 spid51 * EXECUTE sp_refreshsqlmodule N'[dbo]. [usp_TestSP]»
data hora.730 spid51 *
data hora.730 spid51 *

      

Resolução

Informações de atualização cumulativa

Este problema foi corrigido nas seguintes atualizações:

          

Recomendação: Instale a atualização cumulativa mais recente para o SQL Server

Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Consulte as atualizações cumulativas mais recentes para SQL Server:

      

Estado

A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".

Referências

Saiba mais sobre a terminologia que a Microsoft utiliza para descrever as atualizações de software.