web-dev-qa-db-ja.com

SQLデータベースに関数が存在するかどうかを確認する方法

データベースに関数が存在するかどうかを確認する必要があります。そのため、関数を削除して再度作成することができます。基本的に、ストアドプロシージャに使用する次のコードのようなものである必要があります。

IF EXISTS (
     SELECT  *
     FROM    dbo.sysobjects
     WHERE   id = OBJECT_ID(N'[dbo].[SP_TEST]')
             AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
124
Dr. Greenthumb

これは、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を考慮するために、オブジェクトに対するすべての権限を再作成する必要があることを意味します。

190
Martin Smith

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' ) 
56
Law Metzler

なぜだけではありません:

IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[YourFunctionName]
END
GO

object_idの2番目の引数はオプションですが、正しいオブジェクトを識別するのに役立ちます。タイプの可能な値は次のとおりです。

  • FN:スカラー関数
  • IF:インラインテーブル値関数
  • TF:テーブル値関数
  • FS:アセンブリ(CLR)スカラー関数
  • FT:アセンブリ(CLR)テーブル値関数
30
Kapé

このようにして、さまざまな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 ) 

プロパティパラメータにリテラル値を渡し、探しているオブジェクトのタイプを指定します。提供できる値の膨大なリストがあります。

9
Jeremy

私はこのスレッドが古いことを知っていますが、AlterDropよりも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
  ...
5
jamiedanq