Dela via


"INSERT EXEC misslyckas eftersom den lagrade proceduren ändrade schemat för måltabellen" i SQL Server 2016

Den här artikeln hjälper dig att lösa ett problem som uppstår eftersom en lagrad procedur i en databas som använder funktionen Query Data Store regelbundet misslyckas.

Ursprunglig produktversion: SQL Server 2016
Ursprungligt KB-nummer: 4465511

Symptom

Föreställ dig följande scenario:

  • Du har en Microsoft SQL Server 2016-databas som använder funktionen Query Data Store.

  • Du har en lagrad procedur som anropar en annan lagrad procedur med hjälp av syntaxen INSERT...EXEC .

  • Funktionen Query Data Store kör regelbundet automatisk rensning när den ökar till sin maximala konfigurerade storlek. Dessutom ändras frågedatalagrets tillstånd från READ_WRITE till READ_ONLY.

I det här scenariot misslyckas körningen av överordnad lagrad procedur regelbundet och du får ett felmeddelande som liknar följande:

Msg 556, nivå 16, delstat 2, radnummer
INSERT EXEC misslyckades eftersom den lagrade proceduren ändrade schemat för måltabellen.

Orsak

Den automatiska rensningsprocessen rensar planen från Query Data Store. Frågan stöter på en omkompileringsåtgärd eftersom planen saknas i Query Data Store. Planen finns dock fortfarande i procedurens cacheminne. När omkompileringsåtgärden inträffar genererar SQL Server avsiktligt fel 556 för att förhindra duplicerad körning av den underordnade proceduren. En sådan duplicerad åtgärd skulle leda till att felaktiga resultat returneras.

Åtgärd

Service Pack-information för SQL Server 2016

Det här problemet har åtgärdats i följande Service Pack för SQL Server:

Service Pack 3 för SQL Server 2016

Om Service Pack för SQL Server:

Service pack är kumulativa. Varje nytt Service Pack innehåller alla korrigeringar som finns i tidigare service pack tillsammans med eventuella nya korrigeringar. Vi rekommenderar att du tillämpar det senaste servicepaketet och den senaste kumulativa uppdateringen för servicepaketet. Du behöver inte installera ett tidigare Service Pack innan du installerar det senaste Service Pack. Mer information om det senaste servicepaketet och den senaste kumulativa uppdateringen finns i Tabell 1 i följande artikel:

Så här avgör du version, utgåva och uppdateringsnivå för SQL Server och dess komponenter

Lösning

Undvik problemet så här:

  1. Öka storleken på Query Data Store. Detta minskar frekvensen eller sannolikheten för att Query Data Store rensar planen och går in i READ_ONLY driftläget.

  2. Lägg till felhantering i koden för att fånga fel 556 och skicka sedan frågan igen INSERT EXEC .

  3. Rensa procedurens cache när Query Data Store återgår till READ_WRITE tillståndet från READ_ONLY.

Ytterligare information

På grund av de ändringar som gjordes i Query Data Store i Microsoft SQL Server 2017 uppstår inte det här problemet i SQL Server 2017.