Обновление от января 2017 г. - SQL Server 2016+ / База данных SQL Azure
SQL Server 2016 и текущая версия базы данных SQL Azure теперь имеют следующий синтаксис для функций, процедур, таблиц, баз данных и т. Д. ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
А SQL Server 2016 с пакетом обновления 1 (SP1) добавляет еще улучшенную функциональность для модулей (функций, процедур, триггеров, представлений), что означает отсутствие потери разрешений или зависимостей ( CREATE OR ALTER
):
CREATE OR ALTER FUNCTION dbo.fn_myfunc ...
Оба эти улучшения синтаксиса могут привести к гораздо более простым сценариям, используемым для управления исходным кодом, развертываниям и т. Д.
Но если вы используете ...
Старые версии
Вам нужно сделать то, что делает SQL Server, когда вы пишете сценарий из 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
Или вы можете сказать:
BEGIN TRY
DROP FUNCTION dbo.fn_myfunc;
END TRY
BEGIN CATCH
PRINT 'Function did not exist.';
END CATCH
GO
CREATE FUNCTION...
Или вы можете просто сказать:
DROP FUNCTION dbo.fn_myfunc;
GO
CREATE FUNCTION...
(Здесь вы получите сообщение об ошибке, если функция еще не существует, но сценарий будет продолжен со следующего GO, так что независимо от того, сработало удаление или нет, функция все равно будет (повторно) создана.)
Обратите внимание, что если вы удалите функцию и создадите ее заново, вы потеряете права доступа и, возможно, информацию о зависимостях.