Share via


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

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

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

  3. Löschen Sie den Prozedurcache, wenn der Abfragedatenspeicher von READ_ONLYin den READ_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.