Bunun basit olması gerektiğini biliyorum, ancak bir işlevin oluşturulmasına önceden var olup olmadığını kontrol ederek nasıl önsöz yapabilirim? Varsa, onu bırakıp yeniden oluşturmak istiyorum.
Bunun basit olması gerektiğini biliyorum, ancak bir işlevin oluşturulmasına önceden var olup olmadığını kontrol ederek nasıl önsöz yapabilirim? Varsa, onu bırakıp yeniden oluşturmak istiyorum.
Yanıtlar:
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 * tablolarından kaçınmak istiyorsanız, bunun yerine yapabilirsiniz ( buradan örnek A'da):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
Yakalanacak en önemli şey, silmeye çalıştığınız işlevin türüdür (en üstteki sql'de FN, IF ve TF ile gösterilir):
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
İsmi sysobjects'te de arayabilirsiniz.
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
Aslında, işlev bir tablo işlevi olabilirse, kullanmanız gerekir
xtype in ('FN','TF')
Yordamı SQL Server 2016'da bırakıp yeniden oluşturmak için iki seçeneğiniz vardır.
SQL Server 2016'dan başlayarak - kullanım IF EXISTS
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ] [;]
SQL Server 2016 SP1'den başlayarak - kullanım OR ALTER
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
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
Genellikle sys * tipi tablolardan gelen sorgulardan uzak dururum, satıcılar bunları büyük veya başka sürümler arasında değiştirme eğilimindedir. Her zaman yaptığım şey DROP FUNCTION <name>
ifadeyi yayınlamak ve geri gelebilecek herhangi bir SQL hatası için endişelenmemek. DBA dünyasındaki bu standart prosedürü düşünüyorum.
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
GO
İşte bu konudaki görüşüm:
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;
İşlev için Varsa Kontrol Edin
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
Depolanan prosedür için Varsa Kontrol Edin, İşlev aşağıdaki bağlantıya tıklayarak da http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
SQL Server'a özgü değil, SQL ISO standardı INFORMATION_SCHEMA kullanmak istiyorsanız sysobjects
, bunu yapabilirsiniz:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO