2011-03-24 16 views
100

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

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

उत्तर

153

यह वही है 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 -ing पर विचार कर सकें यदि इसके बजाय मौजूद है।

+15

बनाता है मुझे आश्चर्य है ** और भी अधिक ** क्यों (http [वहाँ एक sys.functions नहीं है]: // stackoverflow। com/प्रश्न/468672/sql-server-where-is-sys-functions) सिस्टम कैटलॉग दृश्य ..... –

+1

धन्यवाद मार्टिन, आपका उत्तर स्पॉट पर है! –

42

मैं INFORMATION_SCHEMA का उपयोग करते हैं:

IF EXISTS (SELECT 1 
      FROM Information_schema.Routines 
      WHERE Specific_schema = 'dbo' 
        AND specific_name = 'Foo' 
        AND Routine_Type = 'FUNCTION') 
कार्यों के लिए

, और संग्रहित प्रक्रियाओं

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

कूल मैं इस तरह कुछ ढूंढ रहा था और इसे कभी नहीं मिला। मेरा मानना ​​है कि सामान्य रूप से info_schema का उपयोग करना बेहतर है क्योंकि यह किसी विशिष्ट RDBMS से बंधे नहीं है। (क्रॉस-प्लेटफॉर्म संगत होने की धारणा इस उत्तर से आई थी: http://stackoverflow.com/a/14290099/420667) – user420667

+0

यह स्वीकार्य उत्तर होना चाहिए। – Crono

9

के लिए Routine_Type बदल मैं तुम्हें जाँच करने के लिए एक बहुत ही गैर वर्बोज़ और स्पष्ट दृष्टिकोण का उपयोग कर सकते मिल गया है अस्तित्व के लिए विभिन्न 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+ में उपलब्ध है। एमएसडीएन लेख here पाया जा सकता है।

OBJECTPROPERTY समारोह निम्नलिखित हस्ताक्षर का उपयोग करता है:

OBJECTPROPERTY (id , property) 

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

+0

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

11

क्यों नहीं बस:

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

कम से कम यह मेरे लिए काम करता है ..

+0

कूल! साफ़ और सरल। यह ज्यादातर मामलों में स्वीकार्य है। –

+3

तकनीकी रूप से यह असफल हो सकता है क्योंकि यह केवल जांचता है कि उस नाम का एक वस्तु है। ऐसा नहीं है कि एक वस्तु है और यह एक कार्य है। E.G. यदि 'अपना कार्यनाम तालिका बनाएं (एक्स आईएनटी);' तो कोड चलाना विफल हो जाएगा। –

+0

@ मार्टिनस्मिथ: मजबूत बनाने में आसान।बस 'object_id (' YourFunction ',' FN ')' या किसी अन्य डिज़ाइनर (द्वितीय तर्क) का उपयोग करें जो यह स्पष्ट करता है कि आप किस प्रकार की ऑब्जेक्ट का जिक्र कर रहे हैं। – darlove

1

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

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 PROCEDURE [dbo].[foo] 
    AS 
    ...