Fehler "INSERT EXEC schlägt fehl, weil die gespeicherte Prozedur das Schema der Zieltabelle geändert hat" in SQL Server 2016
In diesem Artikel können Sie ein Problem umgehen, das auftritt, weil eine gespeicherte Prozedur in einer Datenbank, die das Abfragedatenspeicherfeature verwendet, regelmäßig fehlschlägt.
Ursprüngliche Produktversion: SQL Server 2016
Ursprüngliche KB-Nummer: 4465511
Problembeschreibung
Stellen Sie sich folgendes Szenario vor:
Sie verfügen über eine Microsoft SQL Server 2016-Datenbank, die das Abfragedatenspeicherfeature verwendet.
Sie verfügen über eine gespeicherte Prozedur, die mithilfe der
INSERT...EXEC
Syntax einen Aufruf einer anderen gespeicherten Prozedur vornimmt.Das Feature "Abfragedatenspeicher" führt in regelmäßigen Abständen eine automatische Bereinigung aus, wenn es auf die maximal konfigurierte Größe ansteigt. Darüber hinaus ändert sich der Zustand des Abfragedatenspeichers von in
READ_WRITE
READ_ONLY
.
In diesem Szenario schlägt die Ausführung der übergeordneten gespeicherten Prozedur in regelmäßigen Abständen fehl, und Sie erhalten eine Fehlermeldung, die der folgenden ähnelt:
Msg 556, Level 16, State 2, LineNumber
Insert EXEC ist fehlgeschlagen, weil die gespeicherte Prozedur das Schema der Zieltabelle geändert hat.
Ursache
Bei der automatischen Bereinigung wird der Plan aus dem Abfragedatenspeicher geleert. Bei der Abfrage tritt ein Neukompilierungsvorgang auf, da der Plan im Abfragedatenspeicher fehlt. Der Plan ist jedoch weiterhin im Prozedurcache vorhanden. Standardmäßig löst SQL Server beim Erneutkompilieren fehler 556 aus, um eine doppelte Ausführung der untergeordneten Prozedur zu verhindern. Ein solcher doppelter Vorgang würde dazu führen, dass falsche Ergebnisse zurückgegeben werden.
Lösung
Service Pack-Informationen für SQL Server 2016
Dieses Problem wurde im folgenden Service Pack für SQL Server behoben:
Service Pack 3 für SQL Server 2016
Informationen zu Service Packs für SQL Server:
Service Packs sind kumulativ. Jedes neue Service Pack enthält alle Fixes, die in vorherigen Service Packs enthalten sind, sowie alle neuen Fixes. Es wird empfohlen, das neueste Service Pack und das neueste kumulative Update für dieses Service Pack anzuwenden. Sie müssen kein vorheriges Service Pack installieren, bevor Sie das neueste Service Pack installieren. Weitere Informationen zum neuesten Service Pack und zum neuesten kumulativen Update finden Sie in Tabelle 1 im folgenden Artikel:
Ermitteln der Version, Edition und Updateebene von SQL Server und der zugehörigen Komponenten
Problemumgehung
Gehen Sie folgendermaßen vor, um dieses Problem zu umgehen:
Erhöhen Sie die Größe des Abfragedatenspeichers. Dies verringert die Häufigkeit oder Wahrscheinlichkeit, dass der Abfragedatenspeicher den Plan löscht und in den
READ_ONLY
Betriebsmodus wechselt.Fügen Sie Ihrem Code die Fehlerbehandlung hinzu, um Fehler 556 abzufangen, und übermitteln Sie dann die
INSERT EXEC
Abfrage erneut.Löschen Sie den Prozedurcache, wenn der Abfragedatenspeicher von
READ_ONLY
in denREAD_WRITE
Zustand zurückkehrt.
Weitere Informationen
Aufgrund der Änderungen, die am Abfragedatenspeicher in Microsoft SQL Server 2017 vorgenommen wurden, tritt dieses Problem in SQL Server 2017 nicht auf. Dieses Problem wird in SQL Server 2016 nicht behoben.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für