データベースに関数が存在するかどうかを確認する必要があります。そのため、関数を削除して再度作成することができます。基本的に、ストアドプロシージャに使用する次のコードのようなものである必要があります。
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[SP_TEST]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
これは、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
object_id
の2番目の引数はオプションですが、正しいオブジェクトを識別するのに役立ちます。タイプの可能な値は次のとおりです。
このようにして、さまざまな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の記事は here にあります。
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
...