151

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

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

5 に答える 5

224

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 if Exists を検討することができます。

于 2011-03-24T12:30:40.577 に答える
66

私は 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' ) 
于 2011-09-22T10:51:02.183 に答える
11

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

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

于 2015-02-13T21:46:27.770 に答える