Как удалить функцию, если она уже существует?
Я знаю, что это должно быть просто, но как предисловие создание функции с проверкой, чтобы увидеть, если он уже существует? Если он существует, я хочу отбросить и воссоздать его.
11 ответов:
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*, вы могли бы вместо этого сделать (от здесь в Примере а):
IF object_id(N'function_name', N'FN') IS NOT NULL DROP FUNCTION function_name GO
главное поймать, какой тип функции вы пытаетесь удалить (обозначается в верхнем sql с помощью FN, IF и TF):
- 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
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
у вас есть два варианта, чтобы удалить и воссоздать процедуру в SQL Server 2016.
начиная с SQL Server 2016-используйте "если существует"
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ] [;]
начиная с SQL Server 2016 SP1-используйте "или ALTER"
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
Я обычно уклоняюсь от запросов из таблиц типа sys*, поставщики, как правило, меняют их между выпусками, основными или другими. Что я всегда делал-это вопрос
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
вы можете использовать new умереть заявления вместо большойIF
фантикисинтаксис :
функция DROP [ если существует] {[schema_name. ] имя_функции } [ ,...северный ]
запрос:
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 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
проверьте, существует ли хранимая процедура, функция также, нажав ссылку ниже http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html