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

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 Query Store.

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

  • La función Query Data Store ejecuta periódicamente la limpieza automática al acercarse 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 periódicamente en la ejecución del procedimiento almacenado primario y recibe un mensaje de error similar al siguiente:

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

Causa

El proceso de limpieza automática elimina el plan del almacén de datos de consultas. La consulta experimenta una recompilación porque falta el plan de Query Data Store. 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 de Query Data Store. Esto reducirá la frecuencia o probabilidad de que Query Data Store 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 estado READ_WRITE desde READ_ONLY.

Información adicional

Debido a los cambios realizados en Query Data Store en Microsoft SQL Server 2017, este problema no se produce en SQL Server 2017.