यदि यह पहले से मौजूद है, तो मैं किसी फ़ंक्शन को कैसे छोड़ूं?


101

मुझे पता है कि यह सरल होना चाहिए, लेकिन मैं एक फ़ंक्शन के निर्माण को एक चेक के साथ कैसे प्रस्तुत करता हूं यह देखने के लिए कि क्या यह पहले से मौजूद है? यदि यह मौजूद है, तो मैं इसे गिराना और फिर से बनाना चाहता हूं।

जवाबों:


187
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

मुख्य बात यह है कि आप किस प्रकार के फ़ंक्शन को हटाने की कोशिश कर रहे हैं (एफएन, आईएफ और टीएफ द्वारा शीर्ष एसक्यूएल में दर्शाया गया है):

  • एफएन = स्केलर फ़ंक्शन
  • यदि = इनबिल्ट टेबल फंक्शन
  • TF = तालिका कार्य

हे धन्यवाद, मुझे नहीं पता था कि Object_id का ऑब्जेक्ट के प्रकार के लिए एक दूसरा पैरामीटर था
स्पार्कली

1
दिए गए ऑब्जेक्ट नाम (जो sys.objects में दिखाई देते हैं) को विशिष्ट होना चाहिए, xtype को क्वेरी करना बेमानी है। एक मेज और एक ही नाम के साथ एक संग्रहीत proc बनाने का प्रयास करें ...
GBN

22
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')

2
मैंने हमेशा Object_id पद्धति को प्राथमिकता दी है, यह कोड में पढ़ने में सरल लगता है। हमेशा उत्सुक क्यों Microsoft उत्पन्न नमूना कोड बजाय sys.objects लुकअप का उपयोग करता है ...
स्पार्की

12

यह किसी भी वस्तु के लिए काम करता है , न कि केवल कार्यों के लिए:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

तो बस के रूप में वस्तु का अपना स्वाद जोड़ें:

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction

11

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   


2

मैं आमतौर पर sys * प्रकार की तालिका से प्रश्नों से दूर हटता हूं, विक्रेताओं को रिलीज, प्रमुख या अन्यथा के बीच इनको बदलना पड़ता है। मैंने हमेशा जो किया है वह DROP FUNCTION <name>बयान जारी करना है और किसी भी SQL त्रुटि के बारे में चिंता न करें जो वापस आ सकती है। मैं उस मानक प्रक्रिया को डीबीए दायरे में मानता हूं।


1
sys। SQL Server 2005 में आधिकारिक तरीका है। वे हैं विचारों नहीं तालिकाओं आजकल और वास्तविक sys टेबल हम से छिपे हुए हैं।
gbn

2

से SQL Server 2016 CTP3आप नए उपयोग कर सकते हैं DIE बड़ा बजाय बयान IFरैपर

वाक्य - विन्यास :

DROP FUNCTION [IF EXISTS] {[स्कीमा_नाम। ] function_name} [, ... n]

प्रश्न:

DROP Function IF EXISTS udf_name

अधिक जानकारी यहाँ


0
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO

0

यहाँ मेरा इस पर है:

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;

0

फ़ंक्शन के लिए 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


0

यदि आप 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.