Freigeben über


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 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 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:

  1. 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.

  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 in den READ_WRITE Zustand zurückkehrt READ_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.