Оновлення січня 2017 року - SQL Server 2016+ / база даних SQL Azure
SQL Server 2016 та поточна версія бази даних Azure SQL тепер мають такий синтаксис для функцій, процедур, таблиць, баз даних тощо ( DROP IF EXISTS
):
DROP FUNCTION IF EXISTS dbo.fn_myfunc;
А пакет оновлень 1 з пакетом оновлень SQL Server 2016 додає ще кращі функціональні можливості для модулів (функції, процедури, тригери, види), що означає відсутність втрати дозволів або залежностей ( 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, тож, крапля працювала чи ні, функція все одно буде (знову) створена.)
Зауважте, що якщо ви кинете функцію та відновите її знову, ви також втратите дозволи та інформацію про залежність.