Erreur « 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 parce qu’une procédure stockée dans une base de données qui utilise la fonctionnalité de magasin de données de requête échoue régulièrement.
Version d’origine du produit : SQL Server 2016
Numéro de la base de connaissances d’origine : 4465511
Symptômes
Prenons l’exemple du scénario suivant :
Vous disposez d’une base de données Microsoft SQL Server 2016 qui utilise la fonctionnalité Interroger le magasin de données.
Vous disposez d’une procédure stockée qui effectue un appel à une autre procédure stockée à l’aide de la
INSERT...EXEC
syntaxe .La fonctionnalité de magasin de données de requête exécute régulièrement le nettoyage automatique à mesure qu’elle augmente jusqu’à sa taille maximale configurée. En outre, l’état du magasin de données de requête passe de
READ_WRITE
àREAD_ONLY
.
Dans ce scénario, l’exécution de la procédure stockée parente échoue régulièrement et vous recevez un message d’erreur semblable au suivant :
Msg 556, Niveau 16, État 2, Line LineNumber
INSERT EXEC a échoué, car 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 le retour de résultats incorrects.
Résolution
Informations sur le 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 tous 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 de 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, procédez comme suit :
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 passe en
READ_ONLY
mode de fonctionnement.Ajoutez la gestion des erreurs à votre code pour intercepter l’erreur 556, puis renvoyez la
INSERT EXEC
requête.Effacez le cache de procédures lorsque le magasin de données de requête revient à
READ_WRITE
l’état à partir deREAD_ONLY
.
Informations supplémentaires
En raison des modifications apportées au magasin de données de requête dans Microsoft SQL Server 2017, ce problème ne se produit pas dans SQL Server 2017. Ce problème ne sera pas résolu dans SQL Server 2016.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour