在所有表中搜索列描述描述元

时间:2013-02-21 17:15:42

标签: sql-server

我正在考虑使用扩展属性存储表和列描述,但我希望能够搜索所有表中的描述,以查找特定子字符串的出现。

在下面的示例中,显示的函数返回列表“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%'

是否有更有效的搜索方法可以避免将VALUE字段从SQL_VARIANT转换为varchar?

将此元数据存储在用户定义的自定义表中而不是使用扩展属性会更明智吗?

2 个答案:

答案 0 :(得分:7)

您可以查看系统视图以搜索所有表中的所有列。

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

答案 1 :(得分: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%'

搜索不区分大小写。