Udostępnij za pośrednictwem


Błąd "INSERT EXEC, ponieważ procedura składowana zmieniła schemat tabeli docelowej" w programie SQL Server 2016

Ten artykuł ułatwia obejście problemu, który występuje, ponieważ procedura składowana w bazie danych korzystającej z funkcji magazynu danych zapytań okresowo kończy się niepowodzeniem.

Oryginalna wersja produktu: SQL Server 2016
Oryginalny numer KB: 4465511

Symptomy

Rozważmy następujący scenariusz:

  • Masz bazę danych programu Microsoft SQL Server 2016 korzystającą z funkcji Magazynu danych zapytań.

  • Masz procedurę składowaną, która wywołuje inną procedurę składowaną przy użyciu INSERT...EXEC składni.

  • Funkcja magazynu danych zapytań okresowo uruchamia automatyczne czyszczenie w miarę zwiększania się do maksymalnego skonfigurowanego rozmiaru. Ponadto stan magazynu danych zapytań zmienia się z READ_WRITE na READ_ONLY.

W tym scenariuszu wykonywanie nadrzędnej procedury składowanej okresowo kończy się niepowodzeniem i zostanie wyświetlony komunikat o błędzie podobny do następującego:

Msg 556, Poziom 16, Stan 2, Numer wiersza
Instrukcja INSERT EXEC nie powiodła się, ponieważ procedura składowana zmieniła schemat tabeli docelowej.

Przyczyna

Proces automatycznego oczyszczania opróżnia plan z magazynu danych zapytań. Zapytanie napotka operację ponownego kompilowania, ponieważ w magazynie danych zapytań brakuje planu. Jednak plan jest nadal obecny w pamięci podręcznej procedury. Zgodnie z projektem, gdy wystąpi operacja ponownego kompilowania, program SQL Server zgłasza błąd 556, aby zapobiec zduplikowanemu wykonaniu procedury podrzędnej. Taka operacja duplikatu spowoduje zwrócenie nieprawidłowych wyników.

Rozwiązanie

Informacje o dodatku Service Pack dla programu SQL Server 2016

Ten problem został rozwiązany w następującym dodatku Service Pack dla programu SQL Server:

Dodatek Service Pack 3 dla programu SQL Server 2016

Informacje o dodatku Service Pack dla programu SQL Server:

Dodatki Service Pack są skumulowane. Każdy nowy dodatek Service Pack zawiera wszystkie poprawki, które znajdują się w poprzednich pakietach Service Pack, wraz z nowymi poprawkami. Zalecamy zastosowanie najnowszego dodatku Service Pack i najnowszej aktualizacji zbiorczej dla tego dodatku Service Pack. Nie musisz instalować poprzedniego dodatku Service Pack przed zainstalowaniem najnowszego dodatku Service Pack. Aby uzyskać więcej informacji na temat najnowszego dodatku Service Pack i najnowszej aktualizacji zbiorczej, zapoznaj się z tabelą 1 w następującym artykule:

Jak określić wersję, wydanie i poziom aktualizacji programu SQL Server oraz jego składników

Rozwiązanie

W celu obejścia tego problemu należy wykonać następujące czynności:

  1. Zwiększ rozmiar magazynu danych zapytań. Spowoduje to zmniejszenie częstotliwości lub prawdopodobieństwa wyczyszczenia planu magazynu danych zapytań i wprowadzenia READ_ONLY trybu operacyjnego.

  2. Dodaj obsługę błędów do kodu, aby przechwycić błąd 556, a następnie prześlij ponownie INSERT EXEC zapytanie.

  3. Wyczyść pamięć podręczną procedury, gdy magazyn danych zapytań powraca do READ_WRITE stanu z READ_ONLY.

Dodatkowe informacje

Ze względu na zmiany wprowadzone w magazynie danych zapytań w programie Microsoft SQL Server 2017 ten problem nie występuje w programie SQL Server 2017.