Aktualizacja stycznia 2017 r. - SQL Server 2016+ / Azure SQL Database
SQL Server 2016 i bieżąca wersja bazy danych SQL Azure ma teraz następującą składnię dla funkcji, procedur, tabel, baz danych itp. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
Dodatek Service Pack 1 dla programu SQL Server 2016 dodaje jeszcze lepszą funkcjonalność modułów (funkcje, procedury, wyzwalacze, widoki), co oznacza brak utraty uprawnień lub zależności ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Oba te ulepszenia składni mogą prowadzić do znacznie prostszych skryptów używanych do kontroli źródła, wdrażania itp.
Ale jeśli używasz ...
starsza wersja
Musisz zrobić to, co robi SQL Server, kiedy piszesz to z Management Studio:
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
Lub możesz powiedzieć:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Lub możesz po prostu powiedzieć:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Tutaj pojawi się komunikat o błędzie, jeśli funkcja jeszcze nie istnieje, ale skrypt będzie kontynuował od następnego GO, więc niezależnie od tego, czy upuszczenie działało, czy nie, funkcja będzie nadal (ponownie) tworzona).
Pamiętaj, że jeśli upuścisz tę funkcję i utworzysz ją ponownie, utracisz również uprawnienia i potencjalnie informacje o zależnościach.