Możesz tworzyć procedury składowane, które odwołują się do obiektów, które jeszcze nie istnieją (np. Tabele i funkcje). Nie można tworzyć procedur składowanych, które odwołują się do kolumn, które jeszcze nie istnieją w obiektach, które już istnieją. Jest to obosieczny miecz o odroczonym rozpoznawaniu nazw - SQL Server daje w niektórych przypadkach wątpliwości, ale nie wszystkie. Zobacz pomysły Erlanda, SET STRICT_CHECKS ON;
aby uzyskać pomysły na miejsca, w których to działa i na miejsca, w których się psuje:
http://www.sommarskog.se/strict_checks.html
(A jak chciałby, by było to przeciwieństwo biegunowe tego, czego szukasz - chcesz pozwolić na kompilację czegokolwiek bez względu na istnienie, a on chce sprawdzić każdą kolumnę lub tabelę.)
Nie ma takiego ustawienia, jak SET DEFERRED_NAME_RESOLUTION OFF;
gdyby zostało o to poproszone:
http://connect.microsoft.com/sql/127152
I nie ma takiego ustawienia IGNORE ALL_RESOLUTION;
.
Można to obejść na kilka sposobów, w tym:
(a) używać dynamicznego SQL w odpowiednich procedurach przechowywanych.
(b) zbuduj kod pośredniczący, w CREATE PROCEDURE
którym nic nie ma, a następnie uruchom resztę skryptu, a następnie uruchom program, ALTER PROCEDURE
który ma prawdziwe ciało (w istocie, uruchom procedurę w dwóch fazach).
(c) spraw, aby Twoje narzędzie wdrażania było mądrzejsze w kwestii kolejności operacji. Jeśli zmiany w tabeli wymagają obecności funkcji, należy je skrypty wykonać jako ostatnie. Narzędzia do porównywania schematów, takie jak porównywanie SQL RedGate, są dość dobre w generowaniu skryptów w odpowiedniej kolejności zależności. Nie wspominasz o tym, jakiego narzędzia używasz, ale jeśli to nie robi ...
(d) Martin Smith ma tutaj ciekawe obejście , ale nie bawiłem się nim.