ฉันรู้ว่าสิ่งนี้ต้องง่าย แต่ฉันจะนำหน้าการสร้างฟังก์ชันด้วยการตรวจสอบเพื่อดูว่ามีอยู่แล้วได้อย่างไร หากมีอยู่ฉันต้องการปล่อยและสร้างใหม่
ฉันรู้ว่าสิ่งนี้ต้องง่าย แต่ฉันจะนำหน้าการสร้างฟังก์ชันด้วยการตรวจสอบเพื่อดูว่ามีอยู่แล้วได้อย่างไร หากมีอยู่ฉันต้องการปล่อยและสร้างใหม่
คำตอบ:
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
สิ่งสำคัญที่ต้องจับคือประเภทของฟังก์ชันที่คุณพยายามลบ (แสดงใน 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
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
จากSQL Server 2016 CTP3
คุณสามารถใช้ คำสั่งDIEใหม่แทนการIF
ห่อใหญ่
ไวยากรณ์:
ฟังก์ชัน DROP [IF EXISTS] {[schema_name. ] function_name} [, ... n]
คำถาม:
DROP Function IF EXISTS udf_name
ข้อมูลเพิ่มเติมที่นี่
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
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;
ตรวจสอบว่ามีอยู่สำหรับฟังก์ชัน
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
หากคุณต้องการใช้ INFORMATION_SCHEMA มาตรฐาน SQL ISO และไม่ใช่เฉพาะ SQL Server sysobjects
คุณสามารถทำได้:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO