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 "Query Data Store" verwendet, regelmäßig fehlschlägt.

Originalproduktversion: SQL Server 2016
Ursprüngliche KB-Nummer: 4465511

Symptome

Stellen Sie sich folgendes Szenario vor:

  • Sie verfügen über eine Microsoft SQL Server 2016-Datenbank, die das Feature "Abfragespeicher" verwendet.

  • Sie verfügen über eine gespeicherte Prozedur, die mithilfe der INSERT...EXEC Syntax einen Aufruf an eine andere gespeicherte Prozedur ausführt.

  • Die Query Store-Funktion führt in regelmäßigen Abständen eine automatische Bereinigung durch, wenn sie ihre maximal konfigurierte Größe erreicht. Darüber hinaus ändert sich der Status des Abfragedatenspeichers von READ_WRITE zu READ_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 entfernt den Plan aus dem Query Data Store. Die Abfrage wird neu kompiliert, da der Plan im Query Data Store fehlt. Der Plan ist jedoch weiterhin im Prozedurcache vorhanden. Systembedingt löst SQL Server bei der Neukompilierung des Vorgangs 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.

Auflö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 seiner Komponenten

Behelfslösung

Gehen Sie folgendermaßen vor, um dieses Problem zu umgehen:

  1. Vergrößern Sie die Größe des Abfragedatenspeichers. Dies reduziert die Häufigkeit oder Wahrscheinlichkeit, dass der Query Data Store den Plan löscht und in den READ_ONLY Betriebsmodus wechselt.

  2. Fügen Sie dem Code Fehlerbehandlung hinzu, um Fehler 556 abzufangen, und übermitteln Sie die INSERT EXEC Abfrage erneut.

  3. Löschen Sie den Prozedurcache, wenn der Abfragedatenspeicher aus dem Zustand READ_ONLY in den Zustand READ_WRITE zurückkehrt.

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.