Als Teil meiner Integrationsstrategie habe ich einige SQL-Skripte, die ausgeführt werden, um die Datenbank zu aktualisieren. Das erste, was alle diese Skripte tun, ist zu überprüfen, um zu sehen, ob sie laufen müssen, z.B .:Wie erstelle ich eine gespeicherte Prozedur in SQL Server bedingt?
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 eine gespeicherte Prozedur hinzufügen muss. Der Befehl "create proc" muss der einzige Befehl in einem Stapel von sql-Befehlen sein. Das Einfügen eines "create proc" in meine IF-Anweisung verursacht diesen Fehler:
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
Autsch! Wie lege ich den Befehl CREATE PROC in mein Skript und lasse es nur ausführen, wenn es nötig ist?
Procs immer wieder neu zu erstellen (bedingt fallend) ist eine viel bessere Lösung.Wenn Sie exec benutzen, gewinnen Sie nichts und es gibt Nachteile; Ihr Proc muss Strings entgehen und alle Zeilennummern in Fehlern beziehen sich auf die Zeilennummer relativ zum Exec-Befehl. – Peter
+1 für die Möglichkeit, andere Bedingungen als Existenz zu behandeln (in meinem Fall @@ Version Laufwerke, ob bestimmte Procs erstellt werden oder nicht) – cmsjr
+1 - Ich habe dies verwendet, um meinen CRUD-Generator zu konfigurieren, um eine Stub-Prozedur zu erstellen, wenn es nicht bereits existieren und dann ändern. Dadurch kann ich meine gespeicherten Prozeduren ändern, die CRUD erstellen, aber alle Berechtigungen beibehalten, die den vorhandenen Prozeduren zugewiesen sind. –