INSERT EXEC failed because the stored procedure altered the schema of the target table error in SQL Server 2016

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem eine gespeicherte Prozedur in einer Datenbank, die das Feature "Abfragedatenspeicher" 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 Feature für den Abfragedatenspeicher verwendet.
  • Sie verfügen über eine gespeicherte Prozedur, die einen Aufruf einer anderen gespeicherten Prozedur unter VerwendungINSERT...EXE C-Syntax vort?scht.
  • Der Abfragedatenspeicher führt regelmäßig die automatische Bereinigung aus, wenn die Größe auf die maximal konfigurierte Größe anwächst und der Status des Abfragedatenspeichers geändert fromREAD_WRITEtoREAD_ONLY wird.

In diesem Szenario tritt bei der Ausführung der übergeordneten gespeicherten Prozedur in regelmäßigen Abständen ein Fehler auf, und es wird eine Fehlermeldung angezeigt, die der folgenden ähnelt:

Msg 556, Level 16, State 2, Line 5
Insert EXEC failed because the stored procedure altered the schema of the target table.

Ursache

Wenn der Abfragedatenspeicher die automatische Bereinigung ausgeführt wird, wird der Abfragedatenspeicher für diese Leerung nicht mehr verwendet. Die Abfrage stoßen auf einen Erneutkompilieren-Vorgang, da der Plan im Abfragedatenspeicher fehlt, der Plan jedoch weiterhin im Prozedurcache vorhanden ist. Beim Ausführen des erneuten Kompilierens wird SQL Server Fehler 556 ausgelöst, um die doppelte Ausführung der untergeordneten Prozedur zu verhindern, was dazu führen würde, dass falsche Ergebnisse zurückgegeben werden.

Problemumgehung

Führen Sie die folgenden Schritte aus, um dieses Problem zu beheben:

  1. Vergrößern Sie die Größe des Abfragedatenspeichers. Dadurch wird die Häufigkeit oder Wahrscheinlichkeit reduziert, mit der der Abfragedatenspeicher den Plan ausräumt und in den READ_ONLY Betriebsmodus wechselt.
  2. Fügen Sie dem Code eine Fehlerbehandlung hinzu, um Fehler 556 zu fangen, und übermitteln Sie dann die INSERT EXEC Abfrage erneut.
  3. Löschen Sie den Prozedurcache, wenn der Abfragedatenspeicher wieder in READ_WRITE den Zustand von READ_ONLY zurückkommt.

Weitere Informationen

Aufgrund der Änderungen am Abfragedatenspeicher in Microsoft SQL Server 2017 tritt dieses Problem in SQL Server 2017 nicht auf. This issue won't be fixed in SQL Server 2016.