Ошибка INSERT EXEC, так как хранимая процедура изменила схему целевой таблицы в SQL Server 2016 г.
Эта статья поможет вам обойти проблему, которая возникает из-за того, что хранимая процедура в базе данных, использующей функцию хранилища данных запросов, периодически завершается сбоем.
Исходная версия продукта: SQL Server 2016 г.
Исходный номер базы знаний: 4465511
Симптомы
Рассмотрим следующий сценарий.
У вас есть база данных Microsoft SQL Server 2016, которая использует функцию хранилища данных запросов.
У вас есть хранимая процедура, которая выполняет вызов другой хранимой процедуры с помощью синтаксиса
INSERT...EXEC
.Функция хранилища данных запросов периодически выполняет автоматическую очистку по мере увеличения до максимального настроенного размера. Кроме того, состояние хранилища данных запросов изменяется с
READ_WRITE
наREAD_ONLY
.
В этом сценарии выполнение родительской хранимой процедуры периодически завершается сбоем, и появляется сообщение об ошибке, похожее на следующее:
Msg 556, Level 16, State 2, LineNumber
Сбой INSERT EXEC, так как хранимая процедура изменила схему целевой таблицы.
Причина
Процесс автоматической очистки удаляет план из хранилища данных запросов. Запрос сталкивается с операцией повторной компиляции, так как план отсутствует в хранилище данных запросов. Однако план по-прежнему присутствует в кэше процедур. По умолчанию при выполнении операции повторной компиляции SQL Server выдает ошибку 556, чтобы предотвратить повторяющееся выполнение дочерней процедуры. Такая повторяющаяся операция приведет к возврату неверных результатов.
Разрешение
Сведения о пакете обновления для SQL Server 2016
Эта проблема устранена в следующем пакете обновления для SQL Server:
Пакет обновления 3 (SP3) для SQL Server 2016 г.
Сведения о пакетах обновления для SQL Server:
Пакеты обновления являются накопительными. Каждый новый пакет обновления содержит все исправления, которые были в предыдущих пакетах обновления, а также все новые исправления. Рекомендуется применить последний пакет обновления и последнее накопительное обновление для этого пакета обновления. Вам не нужно устанавливать предыдущий пакет обновления перед установкой последнего пакета обновления. Дополнительные сведения о последнем пакете обновления и последнем накопительном обновлении см. в таблице 1 в следующей статье.
Определение версии, выпуска и уровня обновления SQL Server и его компонентов
Обходной путь
Чтобы обойти эту проблему, выполните указанные ниже действия.
Увеличьте размер хранилища данных запросов. Это снизит частоту или вероятность того, что хранилище данных запросов очистит план и войдет в рабочий
READ_ONLY
режим.Добавьте обработку ошибок в код для перехвата ошибки 556, а затем повторно отправьте
INSERT EXEC
запрос.Очистите кэш процедур, когда хранилище данных запросов возвращается в
READ_WRITE
состояние изREAD_ONLY
.
Дополнительные сведения
Из-за изменений, внесенных в хранилище данных запросов в Microsoft SQL Server 2017, эта проблема не возникает в SQL Server 2017 г. Эта проблема не будет устранена в SQL Server 2016 году.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по