Симптоми
Да предположим, че сте съхранили процедура, която използва курсор върху променлива на таблица в 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 системно съхранена процедура, може да възникне непозволен достъп до памет и може да получавате съобщения за грешка, подобни на следното:
Забележка
Съобщение 596, ниво 21, състояние 1Не може да се продължи изпълнението, защото сесията е в състояние на прекратяване. Съобщение 0, ниво 20, състояние 0Възникна сериозна грешка при текущата команда. Резултатите, ако има такива, трябва да бъдат отхвърлени.
В тази ситуация грешки, които наподобяват следното, също се записват в регистрационните файлове за грешки на SQL Server:
Забележка
дата час.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 * date time spid 51
date time.730 spid51 *
date time.730 spid51 *
date time.730 spid51 * Exception Address = 00007FFC270236D5 Module(sqllang+0000000005036D5)
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 *
Решение
Кумулативна информация за актуализацията
Този проблем е коригиран в следните актуализации:
- Сборна актуализация 13 за SQL Server 2014
- Сборна актуализация 6 за SQL Server 2014 Service Pack 1 (SP1)
- Сборна актуализация 2 за SQL Server 2012 Service Pack 3 (SP3)
- Сборна актуализация 11 за SQL Server 2012 Service Pack 2 (SP2)
Препоръка: Инсталирайте най-новата кумулативна актуализация за SQL Server
Всяка нова кумулативна актуализация за SQL Server съдържа всички актуални поправки и корекции на защитата, които са били включени в предишната кумулативна актуализация. Прегледайте последните кумулативни актуализации за SQL Server:
- Последна сборна актуализация за SQL Server 2014
- Последна кумулативна актуализация за SQL Server 2014 SP1
- Последна кумулативна актуализация за SQL Server 2012 SP2
- Последна кумулативна актуализация за SQL Server 2012 SP3
Състояние
Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.
Справки
Научете повече относно терминологията, която Microsoft използва за описване на актуализациите на софтуера.