2017年1月更新-SQL Server 2016+ / Azure SQL Database
SQL Server 2016および現在のバージョンのAzure SQL Databaseには、関数、プロシージャ、テーブル、データベースなどの次の構文があります。(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 ...
これらの両方の構文の強化により、ソース管理、展開などに使用されるはるかに単純なスクリプトを作成できます。
しかし、使用している場合...
古いバージョン
Management Studioからこれをスクリプト化するとき、SQL Serverが行うことを行う必要があります。
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から続行されるため、ドロップが機能したかどうかに関係なく、関数は(再)作成されます。)
関数を削除して再作成すると、権限と潜在的に依存関係の情報も失われることに注意してください。