Partager via


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 :

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, procédez comme suit :

  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 passe en READ_ONLY mode de fonctionnement.

  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édures lorsque le magasin de données de requête revient à READ_WRITE l’état à partir de READ_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.