2013-06-18 21 views
23

जोड़ने से पहले विस्तारित संपत्ति विवरण पहले से मौजूद है या नहीं, तो मेरे पास एक स्क्रिप्ट है जो विस्तारित गुण जोड़ती है, कुछ तालिका का वर्णन करती हैं, कुछ कॉलम का वर्णन करती हैं। मैं यह कैसे जांच सकता हूं कि विस्तारित संपत्ति इसे जोड़ने से पहले मौजूद है ताकि स्क्रिप्ट कोई त्रुटि न फेंक सके?जांचें कि

उत्तर

43

यह पहली स्क्रिप्ट जांच करता है कि विस्तारित संपत्ति तालिका का वर्णन मौजूद है:

IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('Table_Name') AND [name] = N'MS_Description' AND [minor_id] = 0) 
EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'This table is responsible for holding information.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Table_Name'; 

यह दूसरी स्क्रिप्ट जांच करता है कि विस्तारित संपत्ति स्तंभ का वर्णन मौजूद है:

IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('Table_Name') AND [name] = N'MS_Description' AND [minor_id] = (SELECT [column_id] FROM SYS.COLUMNS WHERE [name] = 'Column_Name' AND [object_id] = OBJECT_ID('Table_Name'))) 
EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'This column is responsible for holding information for table Table_Name.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Table_Name', @level2type = N'COLUMN', @level2name = N'Column_Name'; 
+0

यह आपके प्रश्न के साथ विलय किया जाना चाहिए। –

+9

जब आप "प्रश्न पूछें" तो आपके पास "अपने स्वयं के प्रश्न का उत्तर दें - अपना ज्ञान, प्रश्नोत्तर शैली साझा करें" का विकल्प है। यही वह है जो मैंने किया था क्योंकि समाधान की खोज करते समय मुझे अपने जैसा कोई प्रश्न नहीं मिला। – ScubaSteve

+0

आह, मैंने देखा, लोगों ने पहले ऐसा नहीं देखा है। –

0

बढ़ाया संपत्ति के किसी भी जांच करने के लिए जो नीचे दी गई तालिका के उपयोग के लिए उपलब्ध है।

IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description') 

अपनी मेज से अधिक विस्तारित संपत्ति है, तो minor_id के रूप में स्तंभ आईडी दे।

IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description' AND minor_id = 3) 

क्वेरी sys.extended_properties कैटलॉग देखें अपने डेटाबेस में सभी विस्तारित गुण प्राप्त करने के लिए।

अधिक जानकारी का उपयोग http://msdn.microsoft.com/en-us/library/ms177541(v=sql.110).aspx

3

मैं जोड़ सकते हैं या करने के लिए सरल संग्रहीत प्रक्रिया लिखा अद्यतन बढ़ाया संपत्ति 'MS_Description':

IF OBJECT_ID ('dbo.usp_addorupdatedescription', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.usp_addorupdatedescription; 
GO 

CREATE PROCEDURE usp_addorupdatedescription 
    @table nvarchar(128), -- table name 
    @column nvarchar(128), -- column name, NULL if description for table 
    @descr sql_variant  -- description text 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @c nvarchar(128) = NULL; 

    IF @column IS NOT NULL 
     SET @c = N'COLUMN'; 

    BEGIN TRY 
     EXECUTE sp_updateextendedproperty N'MS_Description', @descr, N'SCHEMA', N'dbo', N'TABLE', @table, @c, @column; 
    END TRY 
    BEGIN CATCH 
     EXECUTE sp_addextendedproperty N'MS_Description', @descr, N'SCHEMA', N'dbo', N'TABLE', @table, @c, @column; 
    END CATCH; 
END 
GO 
+0

मुझे इस दृष्टिकोण को पसंद है, हालांकि मैं एक उदाहरण में भाग गया जहां इस क्वेरी को निष्पादित करने के बाद मेरे पास खुले लेनदेन हैं। '' संदेश 266, स्तर 16, राज्य 2, प्रक्रिया up_DataDict, रेखा 178 EXECUTE के बाद लेनदेन की गणना BEGIN और COMMIT बयानों की एक मेल नहीं खाता इंगित करती है। पिछली गिनती = 0, वर्तमान गणना = 1. '' – Damian

+0

मैंने नीचे एक समान दृष्टिकोण पोस्ट किया है, जो कोशिश/पकड़, लेनदेन रोलबैक (सुरुचिपूर्ण नहीं है, लेकिन डैमियन –

+0

द्वारा उठाए गए चिंताओं से बचाता है। कार्यक्रम प्रवाह को नियंत्रित करने के लिए अपवाद हैंडलिंग (यानी आईएफ कथन के साथ क्या किया जा सकता है), एक [कोड गंध] (https://en.wikipedia.org/wiki/Code_smell) है! इसे देखें [stackoverflow सवाल] (https: //softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-Considered-a-serious-antipattern-if-so- क्यों) – DaveBoltman

1

यहाँ एक और संग्रहीत प्रक्रिया दृष्टिकोण, रुस्लान लालकृष्ण के लिए समान है, लेकिन इसमें कोशिश/पकड़ या स्पष्ट लेनदेन शामिल नहीं है:

-- simplify syntax for maintaining data dictionary 

IF OBJECT_ID ('dbo.usp_addorupdatedescription', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.usp_addorupdatedescription; 
GO 

CREATE PROCEDURE usp_addorupdatedescription 
     @table nvarchar(128), -- table name 
     @column nvarchar(128), -- column name, NULL if description for table 
     @descr sql_variant  -- description text 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     IF @column IS NOT NULL 
      IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES 
      WHERE [major_id] = OBJECT_ID(@table) AND [name] = N'MS_Description' 
        AND [minor_id] = (SELECT [column_id] 
            FROM SYS.COLUMNS WHERE [name] = @column AND [object_id] = OBJECT_ID(@table))) 
       EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = @descr, 
               @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', 
               @level1name = @table, @level2type = N'COLUMN', @level2name = @column; 
      ELSE 
       EXECUTE sp_updateextendedproperty @name = N'MS_Description', 
                @value = @descr, @level0type = N'SCHEMA', @level0name = N'dbo', 
                @level1type = N'TABLE', @level1name = @table, 
                @level2type = N'COLUMN', @level2name = @column; 
     ELSE 
      IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES 
      WHERE [major_id] = OBJECT_ID(@table) AND [name] = N'MS_Description' 
        AND [minor_id] = 0) 
       EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = @descr, 
               @level0type = N'SCHEMA', @level0name = N'dbo', 
               @level1type = N'TABLE', @level1name = @table; 
      ELSE 
       EXECUTE sp_updateextendedproperty @name = N'MS_Description', @value = @descr, 
                @level0type = N'SCHEMA', @level0name = N'dbo', 
                @level1type = N'TABLE', @level1name = @table; 
    END 
GO 
संबंधित मुद्दे