मुझे पता है कि यह सरल होना चाहिए, लेकिन मैं एक फ़ंक्शन के निर्माण को एक चेक के साथ कैसे प्रस्तुत करता हूं यह देखने के लिए कि क्या यह पहले से मौजूद है? यदि यह मौजूद है, तो मैं इसे गिराना और फिर से बनाना चाहता हूं।
मुझे पता है कि यह सरल होना चाहिए, लेकिन मैं एक फ़ंक्शन के निर्माण को एक चेक के साथ कैसे प्रस्तुत करता हूं यह देखने के लिए कि क्या यह पहले से मौजूद है? यदि यह मौजूद है, तो मैं इसे गिराना और फिर से बनाना चाहता हूं।
जवाबों:
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
मुख्य बात यह है कि आप किस प्रकार के फ़ंक्शन को हटाने की कोशिश कर रहे हैं (एफएन, आईएफ और टीएफ द्वारा शीर्ष एसक्यूएल में दर्शाया गया है):
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')
SQL सर्वर 2016 में प्रक्रिया को छोड़ने और फिर से बनाने के लिए आपके पास दो विकल्प हैं।
SQL सर्वर 2016 से शुरू - उपयोग करें IF EXISTS
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ] [;]
SQL सर्वर 2016 SP1 से शुरू - उपयोग करें 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
मैं आमतौर पर sys * प्रकार की तालिका से प्रश्नों से दूर हटता हूं, विक्रेताओं को रिलीज, प्रमुख या अन्यथा के बीच इनको बदलना पड़ता है। मैंने हमेशा जो किया है वह DROP FUNCTION <name>
बयान जारी करना है और किसी भी SQL त्रुटि के बारे में चिंता न करें जो वापस आ सकती है। मैं उस मानक प्रक्रिया को डीबीए दायरे में मानता हूं।
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 एक्स्टिस्ट की जाँच करें
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
चेक करें IF स्टॉस्ट प्रक्रिया के लिए मौजूद रहें, नीचे दिए गए लिंक पर क्लिक करके भी http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
यदि आप SQL ISO मानक INFORMATION_SCHEMA का उपयोग करना चाहते हैं और SQL सर्वर-विशिष्ट नहीं sysobjects
, तो आप यह कर सकते हैं:
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO