【发布时间】:2011-01-18 10:42:15
【问题描述】:
我知道这一定很简单,但是如何在创建函数之前先检查它是否已经存在?如果它存在,我想删除并重新创建它。
【问题讨论】:
标签: tsql sql-server-2000
我知道这一定很简单,但是如何在创建函数之前先检查它是否已经存在?如果它存在,我想删除并重新创建它。
【问题讨论】:
标签: tsql sql-server-2000
这适用于任何对象,而不仅仅是函数:
IF OBJECT_ID('YourObjectName') IS NOT NULL
然后只需添加您喜欢的对象,如下所示:
IF OBJECT_ID('YourFunction') IS NOT NULL
DROP FUNCTION YourFunction
【讨论】:
如果您想使用 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
【讨论】:
这是我的看法:
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;
【讨论】:
从SQL Server 2016 CTP3 开始,您可以使用新的DIE 语句代替大的IF 包装器
语法:
删除函数 [ 如果存在 ] { [ schema_name. ] 函数名 } [ ,...n ]
查询:
DROP Function IF EXISTS udf_name
更多信息here
【讨论】:
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
GO
【讨论】:
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 中的 here):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
要抓住的主要是您要删除的函数类型(在顶部 sql 中用 FN、IF 和 TF 表示):
【讨论】:
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
【讨论】:
我通常回避来自 sys* 类型表的查询,供应商倾向于在主要版本或其他版本之间更改这些。我一直做的是发出DROP FUNCTION <name> 语句,而不用担心可能会再次出现任何SQL 错误。我认为这是 DBA 领域的标准程序。
【讨论】:
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')
【讨论】: