Błąd "INSERT EXEC nie powiedzie się, ponieważ procedura składowana zmieniła schemat tabeli docelowej" w SQL Server 2016 r.
Ten artykuł ułatwia obejście problemu, który występuje, ponieważ procedura składowana w bazie danych korzystająca z funkcji Magazynu danych zapytań okresowo kończy się niepowodzeniem.
Oryginalna wersja produktu: SQL Server 2016
Oryginalny numer KB: 4465511
Symptomy
Rozpatrzmy następujący scenariusz:
Masz bazę danych microsoft SQL Server 2016, która korzysta 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 oczyszczanie w miarę zwiększania 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 pojawia się komunikat o błędzie podobny do następującego:
Msg 556, Poziom 16, Stan 2, LineNumber
WSTAW EXEC nie powiodło się, ponieważ procedura składowana zmieniła schemat tabeli docelowej.
Przyczyna
Proces automatycznego oczyszczania opróżnia plan z magazynu danych zapytań. Zapytanie napotyka operację ponownego kompilacji, ponieważ brakuje planu w magazynie danych zapytań. Jednak plan jest nadal obecny w pamięci podręcznej procedury. Zgodnie z projektem, gdy wystąpi operacja ponownego kompilacji, SQL Server zgłasza błąd 556, aby zapobiec zduplikowanemu wykonaniu procedury podrzędnej. Taka zduplikowana operacja spowodowałaby zwrócenie nieprawidłowych wyników.
Rozwiązanie
Informacje o dodatku Service Pack dla SQL Server 2016 r.
Ten problem został rozwiązany w następującym dodatku Service Pack dla SQL Server:
Dodatek Service Pack 3 dla SQL Server 2016 r.
Informacje o dodatkach Service Pack dla SQL Server:
Dodatki Service Pack są skumulowane. Każdy nowy dodatek Service Pack zawiera wszystkie poprawki znajdujące się w poprzednich dodatkach Service Pack wraz z wszelkimi nowymi poprawkami. Zalecamy zastosowanie najnowszego dodatku Service Pack i najnowszej aktualizacji zbiorczej dla tego dodatku Service Pack. Przed zainstalowaniem najnowszego dodatku Service Pack nie trzeba instalować poprzedniego dodatku Service Pack. Aby uzyskać więcej informacji na temat najnowszego dodatku Service Pack i najnowszej aktualizacji zbiorczej, zapoznaj się z tabelą 1 w poniższym artykule:
Jak określić poziom wersji, wersji i aktualizacji SQL Server i jej składników
Obejście problemu
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 przez magazyn danych zapytań i wprowadzenia
READ_ONLY
trybu operacyjnego.Dodaj obsługę błędów do kodu, aby wychwycić błąd 556, a następnie prześlij
INSERT EXEC
ponownie zapytanie.Wyczyść pamięć podręczną procedury, gdy magazyn danych zapytań powróci do
READ_WRITE
stanu z .READ_ONLY
Informacje dodatkowe
Ze względu na zmiany wprowadzone w magazynie danych zapytań w usłudze Microsoft SQL Server 2017 r. ten problem nie występuje w SQL Server 2017 r. Ten problem nie zostanie rozwiązany w SQL Server 2016 roku.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla