Update Januar 2017 - SQL Server 2016+ / Azure SQL-Datenbank
SQL Server 2016 und die aktuelle Version der Azure SQL-Datenbank haben jetzt die folgende Syntax für Funktionen, Prozeduren, Tabellen, Datenbanken usw. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
SQL Server 2016 Service Pack 1 bietet noch bessere Funktionen für Module (Funktionen, Prozeduren, Trigger, Ansichten), sodass keine Berechtigungen oder Abhängigkeiten verloren gehen ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Diese beiden Syntaxverbesserungen können zu wesentlich einfacheren Skripten führen, die für die Quellcodeverwaltung, Bereitstellungen usw. verwendet werden.
Aber wenn Sie verwenden ...
ältere Versionen
Sie müssen die Schritte von SQL Server ausführen, wenn Sie diese in Management Studio ausführen:
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE type = 'FN' AND name = 'fn_myfunc')
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'CREATE FUNCTION ...';
EXEC sp_executesql @sql;
END
Oder du kannst sagen:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Oder Sie können einfach sagen:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Hier wird eine Fehlermeldung angezeigt, wenn die Funktion noch nicht vorhanden ist. Das Skript wird jedoch beim nächsten Start fortgesetzt. Unabhängig davon, ob das Löschen funktioniert hat oder nicht, wird die Funktion dennoch (neu) erstellt.)
Beachten Sie, dass beim Löschen und erneuten Erstellen der Funktion Berechtigungen und möglicherweise auch Abhängigkeitsinformationen verloren gehen.
Der Fehler ist ziemlich selbsterklärend. Es gibt verschiedene Möglichkeiten, das Problem zu beheben.
Teilen Sie das Skript in Management Studio mithilfe des
GO
Pseudo-Schlüsselworts undDROP
/ oderCREATE
des Objekts in verschiedene Stapel auf . (Beachten Sie, dass das Schlüsselwort selbst in den Management Studio-Optionen geändert werden kann, dies ist jedoch de facto die Einstellung. Ich empfehle daher, das Schlüsselwort in Ruhe zu lassen.)Wenn Sie ein Skript (oder den ausgewählten Teil eines Skripts) ausführen, trennt Management Studio jeden Skriptblock zwischen
GO
s und sendet die Teile nacheinander als separate Stapel an SQL Server.Verwenden Sie dynamisches SQL, um einen separaten Stapel aus einem anderen Stapel heraus zu senden.
Dies ist die bevorzugte Methode, da dann die korrekte Ausführung Ihres Skripts nicht von externen Funktionen abhängt. Wenn Ihre Anwendung beispielsweise über ein Programm zur Datenbankaktualisierung verfügt, wird in der Regel eine Skriptdatei geladen und anschließend auf dem Zielserver ausgeführt. Entweder müssen Sie Logik hinzufügen, um die Stapel wie in Management Studio zu trennen (Hinweis: Mit Gefahren behaftet), oder Sie müssen das Skript so schreiben, dass das gesamte Skript erfolgreich als einzelner Stapel ausgeführt werden kann.
Wie in einer anderen Antwort erwähnt, können Sie
CREATE
mit dieser Methode (oder einer anderen Kombination vonDROP
/CREATE
usw.) einen Test durchführen . Am liebsten erstelle ich ein Stub-Objekt, wenn das Objekt nicht vorhanden ist, und erstelleALTER <object>
oder ändere es dann tatsächlich. Bei diesem Ansatz werden keine Abhängigkeiten gelöscht, z. B. Berechtigungen oder erweiterte Eigenschaften, und es ist nicht erforderlich, fehleranfällige Logik zu kopieren / einzufügen, um dasCREATE
/ALTER
in einer einzelnen Anweisung auszuführen.Hier ist die Vorlage, die ich zum Erstellen oder Ändern einer Skalarfunktion verwende. Ich überlasse es dem Leser als Übung, dies an andere Arten von Objekten (gespeicherte Prozesse, Trigger usw.) anzupassen.
quelle
GO
stellt sicher, dass das Skript nicht mehr funktioniert, daIF
es nirgendwo hinführt.DROP
/CREATE
Drehbuch nachgedacht - bearbeitet. Vielen Dank.Sie haben die Möglichkeit zu prüfen, ob das Objekt in der existiert
database
und wenn nicht, anzulegen:quelle