関数が既に存在する場合、どのようにドロップしますか?


101

これは単純でなければならないことはわかっていますが、関数が既に存在するかどうかを確認する関数の作成をどのように始めるのですか?存在する場合は、ドロップして再作成します。

回答:


187
IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'function_name') 
    AND xtype IN (N'FN', N'IF', N'TF')
)
    DROP FUNCTION function_name
GO

sys *テーブルを回避したい場合は、代わりに(例Aのここから)実行できます。

IF object_id(N'function_name', N'FN') IS NOT NULL
    DROP FUNCTION function_name
GO

キャッチする主なことは、削除しようとしている関数のタイプです(FN、IF、およびTFによって上部のSQLに示されています)。

  • FN =スカラー関数
  • IF =インラインテーブル関数
  • TF =テーブル関数

こんにちは、Object_idにオブジェクトのタイプの2番目のパラメータがあることを知りませんでした
Sparky

1
指定されたオブジェクト名(sys.objectsに表示される)は一意である必要があります。xtypeのクエリは冗長です。同じ名前のテーブルとストアド
プロシージャ

22
if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>

sysobjectsで名前を調べることもできます

IF EXISTS (SELECT * 
       FROM   sysobjects 
           WHERE name='<function name>' and xtype='FN'

実際には、関数がテーブル関数である可能性がある場合は、

xtype in ('FN','TF')

2
私は常にObject_idメソッドを優先してきましたが、コードを読み取る方が簡単なようです。Microsoftが生成したサンプルコードが代わりにsys.objectsルックアップを使用する理由を常に知りたい...
Sparky

12

これは、関数だけでなく、どのオブジェクトでも機能します。

IF OBJECT_ID('YourObjectName') IS NOT NULL 

次に、次のようにオブジェクトのフレーバーを追加します。

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction

11

SQL Server 2016でプロシージャを削除して再作成するには、2つのオプションがあります。

SQL Server 2016以降-使用 IF EXISTS

DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]   [;]

SQL Server 2016 SP1以降-使用 OR ALTER

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   


2

私は通常、sys *タイプのテーブルからのクエリを避けています。ベンダーは、メジャーまたはその他のリリース間でこれらを変更する傾向があります。私が常に行っているのは、DROP FUNCTION <name>ステートメントを発行することであり、SQLエラーが返されることを心配する必要はありません。私はDBAレルムでの標準的な手順を検討します。


1
sys。SQL Server 2005では公式な方法です。彼らは、あるビューではない、今日のテーブルとテーブルが私たちから隠されている実際のSYS。
gbn 2010

2

よりSQL Server 2016 CTP3新しい使用することができますDIEの 文の代わりに、大きなIFラッパを

構文:

DROP FUNCTION [存在する場合] {[schema_name。] function_name} [、... n]

クエリ:

DROP Function IF EXISTS udf_name

詳細はこちら


0
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO

0

これが私の見解です。

if(object_id(N'[dbo].[fn_Nth_Pos]', N'FN')) is not null
    drop function [dbo].[fn_Nth_Pos];
GO
CREATE FUNCTION [dbo].[fn_Nth_Pos]
(
    @find char, --char to find
    @search varchar(max), --string to process   
    @nth int --occurrence   
)
RETURNS int
AS
BEGIN
    declare @pos int --position of nth occurrence
    --init
    set @pos = 0

    while(@nth > 0)
    begin       
        set @pos = charindex(@find,@search,@pos+1)
        set @nth = @nth - 1
    end 

    return @pos
END
GO

--EXAMPLE
declare @files table(name varchar(max));

insert into @files(name) values('abc_1_2_3_4.gif');
insert into @files(name) values('zzz_12_3_3_45.gif');

select
    f.name,
    dbo.fn_Nth_Pos('_', f.name, 1) as [1st],
    dbo.fn_Nth_Pos('_', f.name, 2) as [2nd],
    dbo.fn_Nth_Pos('_', f.name, 3) as [3rd],
    dbo.fn_Nth_Pos('_', f.name, 4) as [4th]
from 
    @files f;


0

SQL Server固有sysobjectsではなく、SQL ISO標準のINFORMATION_SCHEMAを使用する場合は、次のようにします。

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.