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

我知道这一定很简单,但是我怎么用一个检查来创build一个函数,看它是否已经存在? 如果存在,我想删除并重新创build它。

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 

要抓住的主要是你想要删除的函数是什么types(由FN,IF和TF在顶部的sql中表示):

  • FN =标量函数
  • IF =内联表函数
  • TF =表函数
 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') 

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

 IF OBJECT_ID('YourObjectName') IS NOT NULL 

那么只需添加你的对象的味道,如:

 IF OBJECT_ID('YourFunction') IS NOT NULL DROP FUNCTION YourFunction GO 
 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 

您有两个选项可以删除并重新创buildSQL 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 

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

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

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

句法 :

DROP FUNCTION [IF EXISTS] {[schema_name。 ] function_name} [,… n]

查询:

 DROP Function IF EXISTS udf_name 

更多信息在这里

这是我的承担:

 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; 

检查IF是否存在函数

  IF EXISTS (SELECT TOP 1 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'[Schema].[function_Name]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) BEGIN DROP FUNCTION [Schema].[function_Name] Print('function dropped => [Schema].[function_Name]') END GO 

检查中存在的存储过程,function也可以点击下面的链接http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html