Partager via


« INSERT EXEC échoue car la procédure stockée a modifié le schéma de la table cible » dans SQL Server 2016

Cet article vous aide à contourner un problème qui se produit, car une procédure stockée dans une base de données qui utilise la fonctionnalité magasin de données de requête échoue régulièrement.

Version du produit d’origine : SQL Server 2016
Numéro de base de connaissances d’origine : 4465511

Symptômes

Examinez le cas suivant :

  • Vous disposez d’une base de données Microsoft SQL Server 2016 qui utilise la fonctionnalité magasin de données de requête.

  • Vous disposez d’une procédure stockée qui appelle une autre procédure stockée à l’aide de la INSERT...EXEC syntaxe.

  • La fonctionnalité magasin de données de requête exécute régulièrement le nettoyage automatique à mesure qu’elle augmente à sa taille maximale configurée. En outre, l’état du magasin de données de requête passe READ_WRITE à READ_ONLY.

Dans ce scénario, l’exécution de procédure stockée parente échoue régulièrement et vous recevez un message d’erreur semblable à ce qui suit :

Msg 556, Level 16, State 2, Line LineNumber
INSERT EXEC a échoué parce que la procédure stockée a modifié le schéma de la table cible.

Cause

Le processus de nettoyage automatique vide le plan du magasin de données de requête. La requête rencontre une opération de recompilation, car le plan est manquant dans le magasin de données de requête. Toutefois, le plan est toujours présent dans le cache de procédure. Par conception, lorsque l’opération de recompilation se produit, SQL Server lève l’erreur 556 pour empêcher l’exécution en double de la procédure enfant. Une telle opération en double entraînerait un retour de résultats incorrects.

Résolution

Informations service Pack pour SQL Server 2016

Ce problème est résolu dans le Service Pack suivant pour SQL Server :

Service Pack 3 pour SQL Server 2016

À propos des Service Packs pour SQL Server :

Les Service Packs sont cumulatifs. Chaque nouveau Service Pack contient tous les correctifs qui se trouvent dans les Service Packs précédents, ainsi que les nouveaux correctifs. Nous vous recommandons d’appliquer le dernier Service Pack et la dernière mise à jour cumulative pour ce Service Pack. Vous n’avez pas besoin d’installer un Service Pack précédent avant d’installer le dernier Service Pack. Reportez-vous au tableau 1 dans l’article suivant pour plus d’informations sur le dernier Service Pack et la dernière mise à jour cumulative :

Comment déterminer la version, l’édition et le niveau de mise à jour de SQL Server et de ses composants

Solution de contournement

Pour contourner ce problème, effectuez les étapes suivantes :

  1. Augmentez la taille du magasin de données de requête. Cela réduit la fréquence ou la probabilité que le magasin de données de requête efface le plan et entre en READ_ONLY mode d’exploitation.

  2. Ajoutez la gestion des erreurs à votre code pour intercepter l’erreur 556, puis renvoyez la INSERT EXEC requête.

  3. Effacez le cache de procédure lorsque le magasin de données de requête retourne à READ_WRITE l’état à partir de READ_ONLY.

Informations supplémentaires

En raison des modifications apportées au magasin de données des requêtes dans Microsoft SQL Server 2017, ce problème ne se produit pas dans SQL Server 2017.