Sie können gespeicherte Prozeduren erstellen , die auf noch nicht vorhandene Objekte verweisen (z. B. Tabellen und Funktionen). Sie können keine gespeicherten Prozeduren erstellen, die auf Spalten verweisen, die noch nicht in bereits vorhandenen Objekten vorhanden sind. Dies ist das zweischneidige Schwert der verzögerten Namensauflösung - mit SQL Server können Sie in einigen Fällen, aber nicht in allen Fällen, den Vorteil von Zweifeln genießen. Sehen Sie sich Erlands Ideen an SET STRICT_CHECKS ON;
, um sich ein Bild von den Orten zu machen, an denen dies funktioniert und an denen es bricht:
http://www.sommarskog.se/strict_checks.html
(Und wie er das genaue Gegenteil von dem haben möchte, wonach Sie suchen - Sie möchten zulassen, dass alles kompiliert wird, unabhängig von der Existenz, und er möchte, dass jede einzelne Spalte oder Tabelle überprüft wird.)
Es gibt keine Einstellung, nach der SET DEFERRED_NAME_RESOLUTION OFF;
gefragt wurde:
http://connect.microsoft.com/sql/127152
Und es gibt keine Einstellung wie IGNORE ALL_RESOLUTION;
.
Sie können dies auf verschiedene Arten umgehen, einschließlich:
(a) Verwenden Sie dynamisches SQL in den betroffenen gespeicherten Prozeduren.
(b) Erstellen Sie einen Stub CREATE PROCEDURE
mit nichts darin, führen Sie dann den Rest Ihres Skripts aus, und führen Sie dann einen aus, ALTER PROCEDURE
der den eigentlichen Text enthält (implementieren Sie die Prozedur im Wesentlichen in zwei Phasen).
(c) Machen Sie Ihr Bereitstellungstool in Bezug auf die Reihenfolge der Operationen intelligenter. Wenn Tabellenänderungen das Vorhandensein einer Funktion erfordern, schreiben Sie diese Änderungen zuletzt. Mit Schemavergleichstools wie SQL Compare von RedGate können Sie Skripts in der richtigen Abhängigkeitsreihenfolge generieren. Sie erwähnen nicht, welches Tool Sie verwenden, aber wenn dies nicht der Fall ist ...
(d) Martin Smith hat hier eine interessante Problemumgehung , aber ich habe nicht damit gespielt.