回答:
これは、DROP and CREATE
オプションを使用してスクリプトを作成するときにSSMSが使用するものです
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[foo]')
AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
DROP FUNCTION [dbo].[foo]
GO
変更をデプロイするこのアプローチでは、オブジェクトのすべての権限を再作成する必要があるため、ALTER
代わりに存在する場合は-ingを検討できます。
私はInformation_Schemaを使用する傾向があります:
IF EXISTS ( SELECT 1
FROM Information_schema.Routines
WHERE Specific_schema = 'dbo'
AND specific_name = 'Foo'
AND Routine_Type = 'FUNCTION' )
関数の場合、およびRoutine_Type
ストアドプロシージャの変更
IF EXISTS ( SELECT 1
FROM Information_schema.Routines
WHERE Specific_schema = 'dbo'
AND specific_name = 'Foo'
AND Routine_Type = 'PROCEDURE' )
なぜか:
IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[YourFunctionName]
END
GO
の2番目の引数object_id
はオプションですが、正しいオブジェクトを識別するのに役立ちます。このtype引数には、特に次のような多数の可能な値があります。
CREATE TABLE YourFunctionName(X INT);
、コードの実行は失敗します。
object_id('YourFunction', 'FN')
またはそれはあなたが参照しているオブジェクトの種類のものを明確にし、他の指示(第二引数)。
このように、さまざまなSQL Serverオブジェクトの存在を確認するために、非常に冗長ではない簡単なアプローチを使用できることがわかりました。
IF OBJECTPROPERTY (object_id('schemaname.scalarfuncname'), 'IsScalarFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.tablefuncname'), 'IsTableFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.procname'), 'IsProcedure') = 1
これは、SQL 2005+で使用可能なOBJECTPROPERTY関数に基づいています。MSDNの記事はここにあります。
OBJECTPROPERTY関数は次のシグネチャを使用します。
OBJECTPROPERTY ( id , property )
プロパティパラメータにリテラル値を渡し、探しているオブジェクトのタイプを指定します。提供できる値の膨大なリストがあります。
私は、このスレッドが古いです知っているが、私はちょうどそれがより安全だと考えている人のために、この答えを追加したいAlter
以上Drop
とCreate
。下記の意志が存在する場合、またはしない場合は:Alter
Function
Create
IF NOT EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[foo]')
AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
EXEC('CREATE FUNCTION [dbo].[foo]() RETURNS INT AS BEGIN RETURN 0 END')
GO
ALTER FUNCTION [dbo].[foo]
AS
...
ALTER OR CREATE