2013-06-18 11 views

Antwort

43

Diese erste prüft Skript, wenn die erweiterte Eigenschaft, um die Tabelle mit existiert:

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'; 

Dieses zweite Skript prüft, ob die erweiterte Eigenschaft der Spalte beschreibt, existiert:

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

Dies sollte mit Ihrer Frage zusammengeführt werden. –

+9

Wenn Sie "Frage stellen" haben Sie die Option "Beantworten Sie Ihre eigene Frage - teilen Sie Ihr Wissen, Q & A-Stil". Dies habe ich getan, da ich bei der Suche nach der Lösung keine ähnliche Frage wie meine finden konnte. – ScubaSteve

+0

Ah, ich sehe, habe nicht gesehen, dass Leute das vorher machen. –

0

einem erweiterten Eigenschaft zu überprüfen das für die angegebene Tabelle verfügbare verwenden Sie wie folgt.

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

Wenn Ihre Tabelle mehr als eine erweiterte Eigenschaft hat, geben die Spalten-ID als 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) 

Abfrage sys.extended_properties Katalogsicht alle erweiterten Eigenschaften in Ihrer Datenbank zu erhalten.

Für weitere Informationen verwenden http://msdn.microsoft.com/en-us/library/ms177541(v=sql.110).aspx

3

ich einfach gespeicherte Prozedur schrieb hinzuzufügen oder zu aktualisieren erweiterte Eigenschaft ‚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

Ich mag die Methode, die dies hat, aber ich lief in eine Instanz, wo ich offene Transaktionen nach der Ausführung dieser Abfrage habe. '' ' Nachricht 266, Ebene 16, Status 2, Prozedur up_DataDict, Zeile 178 Transaktionsanzahl nach EXECUTE gibt eine nicht übereinstimmende Anzahl von BEGIN- und COMMIT-Anweisungen an. Vorherige Zählung = 0, aktuelle Zählung = 1. '' ' – Damian

+0

Ich postete einen ähnlichen Ansatz unten, der nicht Try/Catch, Transaktion Rollbacks (nicht so elegant, aber vermeidet die Bedenken von Damian –

+0

nützlich die Ausnahmebehandlung zur Steuerung des Programmablaufs (dh was mit einer IF-Anweisung gemacht werden könnte), ist ein [code smell] (https://en.wikipedia.org/wiki/Code_smell)! Siehe hierzu [stackoverflow question] (https: //softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-consided-a-serious-antipattern-if-so-why) – DaveBoltman

1

Hier ist eine andere gespeicherte Prozedur Ansatz, ähnlich wie Ruslan K., aber das beinhaltet keine try/catch oder explizite transaktionen:

-- 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 
Verwandte Themen