Wie erstelle ich eine gespeicherte Prozedur in SQL Server bedingt?
Als Teil meiner integration-Strategie, ich habe ein paar SQL-Skripts, die ausgeführt werden, um die Datenbank zu aktualisieren. Die erste Sache, die alle diese scripts tun ist, um zu sehen, wenn Sie ausführen müssen, z.B.:
if @version <> @expects
begin
declare @error varchar(100);
set @error = 'Invalid version. Your version is ' + convert(varchar, @version) + '. This script expects version ' + convert(varchar, @expects) + '.';
raiserror(@error, 10, 1);
end
else
begin
...sql statements here...
end
Funktioniert Super! Außer wenn ich brauche, um eine gespeicherte Prozedur hinzufügen. Die "create proc" - Befehl muss der einzige Befehl in einem batch von sql-Befehlen. Putting ein "create proc" in meine IF-Anweisung bewirkt, dass dieser Fehler:
'CREATE/ALTER PROZEDUR' muss die erste Anweisung in einem abfragebatch sein.
Autsch! Wie kann ich die CREATE PROC Befehl in meinem script, und habe es nur ausgeführt, wenn es muss?
InformationsquelleAutor der Frage Josh Hinman | 2008-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich kam mit:
Wickeln Sie es in ein EXEC(), etwa so:
Funktioniert wie ein Charme!
InformationsquelleAutor der Antwort Josh Hinman
Aber watch out für einfachen Anführungszeichen innerhalb der Gespeicherten Prozedur - Sie müssen "escaped" werden durch hinzufügen eines zweiten. Die erste Antwort hat dies getan, aber nur, falls Ihr es verpasst habt. Eine Falle für junge Spieler.
InformationsquelleAutor der Antwort Anthony K
SET NOEXEC ON ist guter Weg, um schalten Sie einen Teil des Codes
Finden Sie hier:
https://codereview.stackexchange.com/questions/10490/conditional-create-must-be-the-only-statement-in-the-batch
P. S. eine Weitere Möglichkeit ist das SET PARSEONLY { ON | OFF }.
InformationsquelleAutor der Antwort Proggear
Versionsverwaltung Ihrer Datenbank ist der Weg zu gehen, aber... Warum bedingt gespeicherte Prozeduren erstellen. Für Sichten, gespeicherte Prozeduren, Funktionen, nur bedingt ablegen und neu erstellen jedes mal. Wenn Sie bedingt erstellen, dann wird man auch nicht clean-up-Datenbanken, die ein problem oder einen hack, habe in 2 Jahren von einem anderen Entwickler (Sie oder ich würden dies nie tun), die sicher war, er würde sich erinnern, um zu entfernen die man mal emergency update.
InformationsquelleAutor der Antwort Peter
Ich muss zugeben, ich würde normalerweise Zustimmen, @Peter - ich bedingt drop und dann unbedingt neu, jedes mal. Ich habe Sie dabei ertappt worden, zu viele Male in der Vergangenheit, wenn Sie versuchen zu spekulieren das schema der Unterschiede zwischen den Datenbanken, mit oder ohne irgendeine form der Versionskontrolle.
Gesagt, dass Sie Ihren eigenen Vorschlag @Josh ist ziemlich cool. Sicherlich interessant ist. 🙂
InformationsquelleAutor der Antwort robsoft
Problem mit dem löschen und erstellen ist Sie verlieren keine Sicherheit gewährt, die bisher angewandt wurden, um das Objekt fallen gelassen wird.
InformationsquelleAutor der Antwort
Dies ist ein Alter thread, aber die Jobo ist falsch: Create Procedure muss die erste Anweisung in einem batch sein. Daher können Sie nicht verwenden
Exists
zum test auf die Existenz und verwenden Sie dann entwederCreate
oderAlter
. Schade.InformationsquelleAutor der Antwort DWalker59
Meine Lösung ist zu prüfen, ob der proc vorhanden ist, wenn ja, dann legen Sie es, und erstellen Sie dann die Prozedur (gleiche Antwort wie @robsoft aber mit einem Beispiel...)
InformationsquelleAutor der Antwort Dave Thompson
verwenden Sie die 'Existiert' - Befehl im T-SQL, um zu sehen, wenn die gespeicherte Prozedur vorhanden ist. Wenn es nicht, verwenden Sie 'Ändern', sonst mit 'Erstellen'
InformationsquelleAutor der Antwort Jobo
InformationsquelleAutor der Antwort