如何删除一个函数,如果它已经存在?
我知道这一定很简单,但是我怎么用一个检查来创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