Udostępnij za pośrednictwem


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 na READ_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:

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

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

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