Compartir a través de


Error de "INSERT EXEC porque el procedimiento almacenado modificó el esquema de la tabla de destino" en SQL Server 2016

Este artículo le ayuda a solucionar un problema que se produce porque se produce un error periódico en un procedimiento almacenado en una base de datos que usa la característica Almacén de datos de consulta.

Versión original del producto: SQL Server 2016
Número de KB original: 4465511

Síntomas

Imagine la siguiente situación:

  • Tiene una base de datos de Microsoft SQL Server 2016 que usa la característica Almacén de datos de consulta.

  • Tiene un procedimiento almacenado que realiza una llamada a otro procedimiento almacenado mediante la INSERT...EXEC sintaxis .

  • La característica Almacén de datos de consulta ejecuta periódicamente la limpieza automática a medida que aumenta a su tamaño máximo configurado. Además, el estado del almacén de datos de consulta cambia de READ_WRITE a READ_ONLY.

En este escenario, la ejecución del procedimiento almacenado primario produce un error periódicamente y recibe un mensaje de error similar al siguiente:

Msg 556, Level 16, State 2, LineNumber
Error de INSERT EXEC porque el procedimiento almacenado modificó el esquema de la tabla de destino.

Causa

El proceso de limpieza automática vacía el plan del almacén de datos de consulta. La consulta encuentra una operación de recompilación porque falta el plan en el Almacén de datos de consulta. Sin embargo, el plan sigue estando presente en la memoria caché de procedimientos. Por diseño, cuando se produce la operación de recompilación, SQL Server produce el error 556 para evitar la ejecución duplicada del procedimiento secundario. Esta operación duplicada provocaría que se devolvieran resultados incorrectos.

Solución

Información de Service Pack para SQL Server 2016

Este problema se ha corregido en el siguiente Service Pack para SQL Server:

Service Pack 3 para SQL Server 2016

Acerca de los Service Pack para SQL Server:

Los Service Pack son acumulativos. Cada service Pack nuevo contiene todas las correcciones que se encuentran en service packs anteriores, junto con las nuevas correcciones. Se recomienda aplicar el Service Pack más reciente y la actualización acumulativa más reciente para ese Service Pack. No es necesario instalar un Service Pack anterior antes de instalar el Service Pack más reciente. Consulte la tabla 1 del siguiente artículo para obtener más información sobre el Service Pack más reciente y la actualización acumulativa más reciente:

Cómo determinar el nivel de versión, edición y actualización de SQL Server y sus componentes

Solución alternativa

Para resolver este problema, siga los siguientes pasos:

  1. Aumente el tamaño del almacén de datos de consulta. Esto reducirá la frecuencia o la probabilidad de que el Almacén de datos de consulta borre el plan y entre en el READ_ONLY modo de funcionamiento.

  2. Agregue el control de errores al código para detectar el error 556 y, a continuación, vuelva a enviar la INSERT EXEC consulta.

  3. Borre la memoria caché de procedimientos cuando el Almacén de datos de consulta vuelva al READ_WRITE estado de READ_ONLY.

Información adicional

Debido a los cambios realizados en el Almacén de datos de consulta en Microsoft SQL Server 2017, este problema no se produce en SQL Server 2017. Este problema no se corregirá en SQL Server 2016.