2013-06-18 24 views

答えて

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

「質問する」を選択すると、「あなた自身の質問に答えてください - あなたの知識、Q&Aスタイルを共有してください」というオプションがあります。これは解決策を研究しているときに似たような質問を見つけることができなかったので、私がしたことです。 – ScubaSteve

+0

ああ、私は、人々がこれを前にやっているのを見たことがない。 –

0

拡張プロパティのいずれかを確認します指定された表で使用できるものは以下のとおりです。

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

テーブルに複数の拡張プロパティがある場合は、列IDを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

私はこのアプローチが好きですが、私はこのクエリを実行した後にOpen Transactionを実行しているインスタンスを実行しました。 '' ' メッセージ266、レベル16、状態2、プロシージャup_DataDict、行178 EXECUTEの後のトランザクション数は、一致しない数のBEGINおよびCOMMIT文を示します。 '' ' – Damian

+0

私はtry/catch、トランザクションのロールバック(エレガントではありませんが、Damianによって提起された懸念を避ける)を使用しないで同様のアプローチを投稿しました –

+0

便利です。プログラムの流れを制御するための例外処理(IF文で何ができるか)は、[code smell](https://en.wikipedia.org/wiki/Code_smell)です。この[stackoverflow question](https: //softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why)。 – DaveBoltman

1

はルスランK.さんに似た別のストアドプロシージャのアプローチであり、試行/キャッチまたは明示的な取引は含まれません。

-- 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 
関連する問題