KB4058565 — ИСПРАВЛЕНИЕ: ошибка утверждения при выполнении хранимой процедуры, ссылающейся на крупный объект в SQL Server 2014, 2016 и 2017

Применяется к
SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows SQL Server 2016 Service Pack 1 SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

Проблема

Ошибка утверждения может возникнуть, когда Microsoft SQL Server многократно выполняет хранимую процедуру, которая выполняет следующие действия:

  • Принимает в качестве аргумента крупный объект, например varchar(max) или varbinary(max);
  • Создает временную таблицу, ограниченную выполнением процедуры, и
  • Использует аргумент большого объекта во временной таблице.

В журнале ошибок SQL Server может быть обнаружена ошибка утверждения, похожая на следующую:

SPID даты и времени Ошибка: 17065, серьезность: 16, состояние: 1.

Утверждение даты и времени SPID SQL Server: FilePath\FileName, строка = LineNumber Failed Assertion = 'fFalse' Попытка доступа к дескрипторе BLOB-объекта с истекшим сроком действия (1). Эта ошибка может быть связана со временем. Если ошибка сохраняется после повторного запуска инструкции, используйте DBCC CHECKDB, чтобы проверка базы данных для структурной целостности, или перезапустите сервер, чтобы убедиться, что структуры данных в памяти не повреждены.

SPID даты и времени Ошибка: 3624, серьезность: 20, состояние: 1.

SPID даты и времени Сбой проверка утверждения системы. Дополнительные сведения см. в журнале ошибок SQL Server. Как правило, сбой утверждения вызван ошибкой программного обеспечения или повреждением данных. Чтобы проверка для повреждения базы данных, рассмотрите возможность запуска DBCC CHECKDB. Если вы согласились отправить дампы в корпорацию Майкрософт во время настройки, в корпорацию Майкрософт будет отправлен мини-дамф. Обновление может быть доступно корпорацией Майкрософт в последнем пакете обновления или в исправлении технической поддержки.

Причина

SQL Server имеет внутреннюю логику для отключения кэширования запросов, ссылающихся на большие объекты, чтобы последующие выполнения не ссылались на эти бизнес-объекты (которые были созданы во время предыдущих запусков и, следовательно, недопустимы для последующих запусков). Эта логика не обработала случай отложенного разрешения имен (DNR) во временных таблицах, в результате чего эти планы кэшировались. Временные таблицы с заданной областью создаются дорого, и SQL Server кэширует их для повторного использования в последующих выполнениях. Это предотвращает повторную компиляцию таких запросов из-за изменений схемы.

Узнайте больше об отложенных разрешениях имен.

Решение

Эта проблема устранена в следующих накопительных обновлениях для SQL Server:

Накопительный пакет обновления 8 для SQL Server 2016 с пакетом обновления 1 (SP1)

Накопительный пакет обновления 4 для SQL Server 2017 г.

Накопительный пакет обновления 10 для SQL Server 2014 с пакетом обновления 2 (SP2)

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

Каждое новое накопительное обновление для SQL Server содержит все исправления и исправления безопасности, которые были в предыдущей сборке. Ознакомьтесь с последним накопительным обновлением для SQL Server:

Последнее накопительное обновление для SQL Server 2016 г.

Последнее накопительное обновление для SQL Server 2017 г.

последние накопительные обновления для SQL Server 2014

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Ссылки

Сведения о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.