Fehler "INSERT EXEC schlägt fehl, da die gespeicherte Prozedur das Schema der Zieltabelle geändert hat" in SQL Server 2016
Dieser Artikel hilft Ihnen, ein Problem zu umgehen, das auftritt, da eine gespeicherte Prozedur in einer Datenbank, die das Feature "Abfragedatenspeicher" verwendet, regelmäßig fehlschlägt.
Originalproduktversion: 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 Feature "Abfragedatenspeicher" verwendet.
Sie verfügen über eine gespeicherte Prozedur, die mithilfe der
INSERT...EXEC
Syntax einen Aufruf an eine andere gespeicherte Prozedur vorgibt.Das Abfragedatenspeicher-Feature führt in regelmäßigen Abständen die automatische Bereinigung aus, da sie auf die maximale konfigurierte Größe ansteigt. Darüber hinaus ändert sich der Status des Abfragedatenspeichers von
READ_WRITE
zuREAD_ONLY
.
In diesem Szenario schlägt die Ausführung der übergeordneten gespeicherten Prozedur regelmäßig fehl, und Sie erhalten eine Fehlermeldung, die etwa wie folgt aussieht:
Msg 556, Level 16, State 2, Line LineNumber
Fehler bei INSERT EXEC, da die gespeicherte Prozedur das Schema der Zieltabelle geändert hat.
Ursache
Der Prozess für die automatische Bereinigung löscht den Plan aus dem Abfragedatenspeicher. Die Abfrage findet einen erneuten Kompilierungsvorgang, da der Plan im Abfragedatenspeicher fehlt. Der Plan ist jedoch weiterhin im Prozedurcache vorhanden. Wenn der vorgang neu kompiliert wird, löst SQL Server den Fehler 556 aus, um die doppelte Ausführung der untergeordneten Prozedur zu verhindern. Ein solcher Duplikatvorgang 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 sich in früheren Service Packs befinden, zusammen mit allen 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:
So bestimmen Sie die Version, Edition und Updateebene von SQL Server und deren Komponenten
Problemumgehung
Gehen Sie folgendermaßen vor, um dieses Problem zu umgehen:
Vergrößern Sie die Größe des Abfragedatenspeichers. Dies reduziert die Häufigkeit oder Wahrscheinlichkeit, dass der Abfragedatenspeicher den Plan ausräumt und in den
READ_ONLY
Betriebsmodus wechselt.Fügen Sie dem Code Fehlerbehandlung hinzu, um Fehler 556 abzufangen, und übermitteln Sie die
INSERT EXEC
Abfrage erneut.Löschen Sie den Prozedurcache, wenn der Abfragedatenspeicher in den
READ_WRITE
Zustand zurückkehrtREAD_ONLY
.
Weitere Informationen
Aufgrund der Änderungen, die an dem Abfragedatenspeicher in Microsoft SQL Server 2017 vorgenommen wurden, tritt dieses Problem in SQL Server 2017 nicht auf.