Compartir a través de


"INSERT EXEC produce un error 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 procedimiento almacenado en una base de datos que usa periódicamente la característica Almacén de datos de consultas.

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

Síntomas

Considere el caso siguiente:

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

  • 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 consultas 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, se produce un error en la ejecución de procedimientos almacenados primarios periódicamente y recibe un mensaje de error similar al siguiente:

Msg 556, Level 16, State 2, LineNumber
Error en INSERT EXEC debido a que el procedimiento almacenado ha alterado el esquema de la tabla de destino.

Causa

El proceso de limpieza automática vacía el plan fuera del almacén de datos de consultas. La consulta encuentra una operación de recompilación porque falta el plan del Almacén de datos de consultas. Sin embargo, el plan todavía está 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 devuelvan 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 Service Packs para SQL Server:

Los Service Packs son acumulativos. Cada nuevo Service Pack contiene todas las correcciones que se encuentran en los 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 tiene que 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 el problema, siga estos pasos:

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

  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 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 consultas en Microsoft SQL Server 2017, este problema no se produce en SQL Server 2017.