Поделиться через


Ошибка 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 для SQL Server 2016

Сведения о пакетах обновления для SQL Server:

Пакеты обновления являются накопительными. Каждый новый пакет обновления содержит все исправления, которые находятся в предыдущих пакетах обновления, вместе с любыми новыми исправлениями. Мы рекомендуем применить последний пакет обновления и последнее накопительное обновление для этого пакета обновления. Перед установкой последнего пакета обновления вам не нужно устанавливать предыдущий пакет обновления. Дополнительные сведения о последнем пакете обновления и последнем накопительном обновлении см. в таблице 1 в следующей статье:

Определение версии, выпуска и обновления SQL Server и его компонентов

Обходное решение

Чтобы устранить эту проблему, выполните следующие действия:

  1. Увеличьте размер хранилища данных запросов. Это приведет к снижению частоты или вероятности очистки плана хранилища данных запросов и ввода READ_ONLY режима работы.

  2. Добавьте обработку ошибок в код, чтобы поймать ошибку INSERT EXEC 556, а затем повторно отправить запрос.

  3. Снимите кэш процедур, когда хранилище данных запросов возвращается в READ_WRITE состояние.READ_ONLY

Дополнительная информация:

Из-за изменений, внесенных в хранилище данных запросов в Microsoft SQL Server 2017, эта проблема не возникает в SQL Server 2017.