2

拡張プロパティを使用してテーブルと列の説明を保存することを検討していますが、すべてのテーブルの説明を検索して、特定の部分文字列の出現を探したいと考えています。

次の例に示す関数は、表「PEOPLE」の列の説明のリストを返します。これらの説明は、"MS_DESCRIPTION" という名前の拡張プロパティとして格納されます。

   SELECT
    cast(VALUE AS VARCHAR(8000)) AS [DESCRIPTION]
                     FROM
                         ::fn_listextendedproperty(NULL
                                                   ,'user'
                                                   ,'dbo'
                                                   ,'table'
                                                   ,'PEOPLE'
                                                   ,'column'
                                                   ,NULL)

ただし、特定の部分文字列について、すべてのテーブルですべての列の説明を検索するにはどうすればよいでしょうか?

SELECT
    cast(VALUE AS VARCHAR(8000)) AS [DESCRIPTION]
                     FROM
                         ::fn_listextendedproperty(NULL
                                                   ,'user'
                                                   ,'dbo'
                                                   ,'table'
                                                   ,'?'
                                                   ,'column'
                                                   ,NULL)
    where cast(VALUE AS VARCHAR(8000)) LIKE '%SEARCH%'

SQL_VARIANT から varchar への VALUE フィールドの変換を回避する、より効率的な検索方法はありますか?

拡張プロパティを使用する代わりに、このメタ データをユーザー定義のカスタム テーブルに格納する方が賢明でしょうか?

4

2 に答える 2

8

システム ビューを参照して、すべてのテーブルのすべての列を検索できます。

SELECT schemas.name schemaName
     , tables.name tableName
     , columns.name columnName
     , extended_properties.value extendedProperties
  FROM sys.schemas
 INNER JOIN sys.tables
    ON schemas.schema_id = tables.schema_id
 INNER JOIN sys.columns
    ON tables.object_id = columns.object_id
 INNER JOIN sys.extended_properties
    ON tables.object_id = extended_properties.major_id
   AND columns.column_id = extended_properties.minor_id
   AND extended_properties.name = 'MS_Description'
   AND CAST( extended_properties.value AS nvarchar(max) ) LIKE '%SEARCH%';
于 2013-02-21T17:45:21.000 に答える
1

特定の名前の列を見つけるには、user1948904 のソリューションが少し簡単になります。

SELECT schemas.name schemaName
   , tables.name tableName
   , columns.name columnName
   , * -- for context if you like
 FROM sys.schemas
 INNER JOIN sys.tables
   ON schemas.schema_id = tables.schema_id
 INNER JOIN sys.columns
   ON tables.object_id = columns.object_id
 WHERE columns.name LIKE '%SEARCH%'

検索では大文字と小文字が区別されません。

于 2013-08-27T14:44:03.070 に答える