SQL डेटाबेस पर फ़ंक्शन मौजूद है या नहीं, इसकी जांच कैसे करें


138

मुझे यह पता लगाने की आवश्यकता है कि क्या कोई फ़ंक्शन डेटाबेस पर मौजूद है, ताकि मैं इसे छोड़ दूं और इसे फिर से बना सकूं। यह मूल रूप से निम्न कोड जैसा कुछ होना चाहिए जो मैं संग्रहीत प्रक्रियाओं के लिए उपयोग करता हूं:

IF EXISTS (
     SELECT  *
     FROM    dbo.sysobjects
     WHERE   id = OBJECT_ID(N'[dbo].[SP_TEST]')
             AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )

जवाबों:


206

यह SSMS का उपयोग करता है जब आप DROP and CREATEविकल्प का उपयोग करके स्क्रिप्ट करते हैं

IF EXISTS (SELECT *
           FROM   sys.objects
           WHERE  object_id = OBJECT_ID(N'[dbo].[foo]')
                  AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
  DROP FUNCTION [dbo].[foo]

GO 

परिवर्तनों को लागू करने के लिए इस दृष्टिकोण का अर्थ है कि आपको ऑब्जेक्ट पर सभी अनुमतियों को फिर से बनाने की आवश्यकता है ताकि आप विचार कर सकें कि ALTERक्या इसके बजाय एक्ज़िस्ट है।


17
मुझे और भी आश्चर्य होता है कि एक sys.functions सिस्टम कैटलॉग दृश्य क्यों नहीं है .....
marc_s

61

मैं Information_Schema का उपयोग करना चाहता हूं:

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'FUNCTION' ) 

कार्यों के लिए, और Routine_Typeसंग्रहीत प्रक्रियाओं के लिए परिवर्तन

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'PROCEDURE' ) 

2
कूल मैं कुछ इस तरह की तलाश में था और यह कभी नहीं मिला। मेरा मानना ​​है कि सामान्य रूप से info_schema का उपयोग करना बेहतर है क्योंकि यह एक विशिष्ट RDBMS से बंधा नहीं है। (इस उत्तर से क्रॉस-प्लेटफॉर्म
कम्पेटिबल

40

सिर्फ क्यों नहीं:

IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[YourFunctionName]
END
GO

का दूसरा तर्क object_idवैकल्पिक है, लेकिन सही वस्तु की पहचान करने में मदद कर सकता है। रहे हैं कई संभावित मान इस प्रकार के तर्क, विशेष रूप से के लिए:

  • एफएन: स्केलर फ़ंक्शन
  • यदि: इनलाइन तालिका-मूल्यवान फ़ंक्शन
  • TF: टेबल-वैल्यू-फंक्शन
  • एफएस: विधानसभा (सीएलआर) स्केलर-फ़ंक्शन
  • एफटी: असेंबली (सीएलआर) तालिका-मूल्यवान फ़ंक्शन

4
तकनीकी रूप से यह विफल हो सकता है क्योंकि यह केवल यह जांचता है कि उस नाम की कोई वस्तु है। ऐसा नहीं है कि कोई वस्तु है और यह एक कार्य है। ईजी अगर CREATE TABLE YourFunctionName(X INT);कोड चलाने में विफल हो जाएगा।
मार्टिन स्मिथ

1
@ मर्टिनस्मिथ: मजबूत बनाने में आसान। बस का उपयोग करें object_id('YourFunction', 'FN')या किसी अन्य पदनाम (दूसरा तर्क) जो यह स्पष्ट करता है कि आप किस प्रकार की वस्तु का उल्लेख कर रहे हैं।

दूसरे पैरामीटर के रूप में 'एफएन' का उपयोग कर @darlove काम नहीं कर सकता है। मेने अभी सीखा। 'एफएन' का मतलब स्केलर फंक्शन होता है। यह लिंक आपको अलग-अलग पैरामीटर मान बताता है जिसे आप sqlhints.com/tag/how-to-check-if-function-exists पास कर सकते हैं । मैं मौजूदा तालिका मान फ़ंक्शन की जाँच करने के लिए 'FN' का उपयोग करता रहता हूं, और यह काम नहीं करता है। मुझे
user12345

9

मैंने पाया है कि आप इस तरह से विभिन्न SQL सर्वर ऑब्जेक्ट के अस्तित्व की जाँच करने के लिए एक बहुत ही गैर क्रिया और सरल दृष्टिकोण का उपयोग कर सकते हैं:

IF OBJECTPROPERTY (object_id('schemaname.scalarfuncname'), 'IsScalarFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.tablefuncname'), 'IsTableFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.procname'), 'IsProcedure') = 1

यह OBJECTPROPERTY फ़ंक्शन पर आधारित है जो SQL 2005+ में उपलब्ध है। MSDN आलेख यहां पाया जा सकता है

OBJECTPROPERTY फ़ंक्शन निम्न हस्ताक्षर का उपयोग करता है:

OBJECTPROPERTY ( id , property ) 

आप संपत्ति पैरामीटर में एक शाब्दिक मूल्य पास करते हैं, जिस प्रकार की वस्तु की तलाश कर रहे हैं। आपके द्वारा आपूर्ति किए जा सकने वाले मूल्यों की एक विशाल सूची है।


मुझे लगता है कि इस उत्तर की सादगी को देखना आसान होगा अगर इसमें पूर्ण / यदि उदाहरण शामिल है।
जोनाथन

6

मुझे पता है कि यह धागा पुराना है, लेकिन मैं सिर्फ उन लोगों के लिए इस उत्तर को जोड़ना चाहता था जो मानते हैं कि यह Alterअधिक सुरक्षित है Dropऔर Create। नीचे होगा यदि वह मौजूद है या यह अगर नहीं करता है:AlterFunctionCreate

  IF NOT EXISTS (SELECT *
               FROM   sys.objects
               WHERE  object_id = OBJECT_ID(N'[dbo].[foo]')
                      AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
       EXEC('CREATE FUNCTION [dbo].[foo]() RETURNS INT AS BEGIN RETURN 0 END')
  GO
  ALTER FUNCTION [dbo].[foo]
  AS
  ...

2
मुझे यह पसंद है, लेकिन मुझे लगता है कि यह "ALTER FUNCTION" होना चाहिए, नहीं?
एरिक

मुझे पसंद हैALTER OR CREATE
AgentFire
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.