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
naREAD_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:
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.Dodaj obsługę błędów do kodu, aby przechwycić błąd 556, a następnie prześlij ponownie
INSERT EXEC
zapytanie.Wyczyść pamięć podręczną procedury, gdy magazyn danych zapytań powraca do
READ_WRITE
stanu zREAD_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.