Saya tahu ini pasti sederhana, tetapi bagaimana cara saya mendahului pembuatan fungsi dengan cek untuk melihat apakah sudah ada? Jika ada, saya ingin melepaskan dan membuatnya kembali.
Saya tahu ini pasti sederhana, tetapi bagaimana cara saya mendahului pembuatan fungsi dengan cek untuk melihat apakah sudah ada? Jika ada, saya ingin melepaskan dan membuatnya kembali.
Jawaban:
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
Jika Anda ingin menghindari tabel sys *, Anda dapat melakukannya (dari sini di contoh A):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
Hal utama yang harus diperhatikan adalah jenis fungsi apa yang Anda coba hapus (dilambangkan di sql atas oleh FN, IF dan TF):
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
Anda juga dapat mencari nama tersebut di sysobjects
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
Sebenarnya, jika fungsinya bisa menjadi fungsi tabel, Anda perlu menggunakan
xtype in ('FN','TF')
Anda memiliki dua opsi untuk melepaskan dan membuat ulang prosedur di SQL Server 2016.
Mulai dari SQL Server 2016 - gunakan IF EXISTS
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ] [;]
Mulai dari SQL Server 2016 SP1 - gunakan 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
Saya biasanya menghindar dari kueri dari tabel tipe sys *, vendor cenderung mengubahnya di antara rilis, utama atau lainnya. Apa yang selalu saya lakukan adalah mengeluarkan DROP FUNCTION <name>
pernyataan dan tidak khawatir tentang kesalahan SQL yang mungkin muncul kembali. Saya menganggap prosedur standar itu di ranah DBA.
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
GO
Inilah pendapat saya tentang ini:
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;
Periksa JIKA Ada Untuk Fungsi
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
Periksa JIKA Ada untuk prosedur Tersimpan, Fungsi juga dengan mengklik tautan di bawah ini http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
Jika Anda ingin menggunakan SQL ISO standar INFORMATION_SCHEMA dan bukan khusus SQL Server sysobjects
, Anda dapat melakukan ini:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO