« 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 :
Solution de contournement
Pour contourner ce problème, effectuez les étapes suivantes :
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.Ajoutez la gestion des erreurs à votre code pour intercepter l’erreur 556, puis renvoyez la
INSERT EXEC
requête.Effacez le cache de procédure lorsque le magasin de données de requête retourne à
READ_WRITE
l’état à partir deREAD_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.