Ошибка 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 и его компонентов

Обходной путь

Чтобы обойти эту проблему, выполните указанные ниже действия.

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

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

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

Дополнительные сведения

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