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

Dav*_*ein 93 t-sql sql-server-2000

我知道这一定很简单,但是我如何通过检查来创建一个函数来查看它是否已经存在?如果它存在,我想删除并重新创建它.

adr*_*nks 175

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
Run Code Online (Sandbox Code Playgroud)

如果你想避免使用sys*表,你可以改为(从例子A中这里):

IF object_id(N'function_name', N'FN') IS NOT NULL
    DROP FUNCTION function_name
GO
Run Code Online (Sandbox Code Playgroud)

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

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


Spa*_*rky 22

if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>
Run Code Online (Sandbox Code Playgroud)

您还可以在sysobjects中查找名称

IF EXISTS (SELECT * 
       FROM   sysobjects 
           WHERE name='<function name>' and xtype='FN'
Run Code Online (Sandbox Code Playgroud)

实际上,如果函数可以是表函数,则需要使用

xtype in ('FN','TF')
Run Code Online (Sandbox Code Playgroud)

  • 我一直更喜欢Object_id方法,在代码中读取似乎更简单.总是好奇为什么Microsoft生成的示例代码使用sys.objects查找而不是...... (2认同)

Met*_*hor 11

这适用于任何对象,而不仅仅是函数:

IF OBJECT_ID('YourObjectName') IS NOT NULL 
Run Code Online (Sandbox Code Playgroud)

然后只需添加你的对象味道,如:

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction
Run Code Online (Sandbox Code Playgroud)


小智 9

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

从SQL Server 2016开始 - 使用"IF EXISTS"

DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]   [;]
Run Code Online (Sandbox Code Playgroud)

从SQL Server 2016 SP1开始 - 使用"OR ALTER"

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
Run Code Online (Sandbox Code Playgroud)


Pரத*_*ீப் 7

SQL Server 2016 CTP3可以使用新的DIE 语句而不是大IF包装器

句法 :

删除函数 [ IF EXISTS ] { [ schema_name. ] 函数名 } [ ,...n ]

询问:

DROP Function IF EXISTS udf_name
Run Code Online (Sandbox Code Playgroud)

更多信息请点击此处


Fio*_*ite 5

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
Run Code Online (Sandbox Code Playgroud)