如果函数已经存在,如何删除它?


101

我知道这一定很简单,但是如何在创建函数之前先检查一下它是否已经存在?如果存在,我要删除并重新创建它。

Answers:


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

要捕获的主要内容是您要删除的函数类型(在最上面的sql中,FN,IF和TF表示):

  • FN =标量函数
  • IF =内联表功能
  • TF =表函数

嘿,谢谢,我不知道Object_id具有对象类型的第二个参数
Sparky 2010年

1
如果给定的对象名称(出现在sys.objects中)必须唯一,则查询xtype是多余的。尝试创建具有相同名称的表和存储的proc ...
gbn 2010年

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 2010年

12

这适用于任何对象,而不仅仅是功能:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

然后只需添加对象的风格,如下所示:

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

11

您有两个选项可以删除并在SQL Server 2016中重新创建过程。

从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   

6
IF EXISTS 
(SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'functionName') 
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))

DROP FUNCTION functionName
GO

2

我通常回避sys *类型表的查询,供应商倾向于在主要版本或其他版本之间进行更改。我一直做的就是发出该DROP FUNCTION <name>语句,而不用担心可能会回来的任何SQL错误。我认为DBA领域中的标准程序。


1
sys。在SQL Server 2005中是官方方式。如今,它们是视图而不是表,实际的sys表对我们来说是隐藏的。
gbn

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 ISO标准INFORMATION_SCHEMA而不是SQL Server特定的标准sysobjects,则可以执行以下操作:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.