Создать новую функцию по коду, если она не существует

Я хочу создать новую функцию по сценарию в моей базе данных. Код сценария ниже:

IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return;

CREATE FUNCTION fn_myfunc ()
returns varchar(10)
AS Begin
...
End

Но когда я выполняю вышеуказанный скрипт, SQL Server возвращает ошибку:

'CREATE FUNCTION' must be the first statement in a query batch.
12 голосов | спросил mehdi lotfi 9 J0000006Europe/Moscow 2012, 08:38:17

1 ответ


13

Обновление Январь 2017 - SQL Server 2016+ /База данных Azure SQL

SQL Server 2016 и текущая версия базы данных Azure SQL теперь имеют следующий синтаксис для функций, процедур, таблиц, баз данных и т. д. ( DROP IF EXISTS):

DROP FUNCTION IF EXISTS dbo.fn_myfunc;

И SQL Server 2016 Service Pack 1 добавляет еще лучшую функциональность для модулей (функций, процедур, триггеров, представлений), что означает отсутствие потери разрешений или зависимостей ( 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, поэтому независимо от того, работает ли откат или нет, функция все равно будет (повторно) создана.)

Обратите внимание, что если вы отбросите функцию и заново создадите ее, вы также потеряете разрешения и информацию о потенциальной зависимости.

ответил Aaron Bertrand 9 J0000006Europe/Moscow 2012, 09:05:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132