我正在考虑使用扩展属性存储表和列描述,但我希望能够搜索所有表中的描述,以查找特定子字符串的出现。
在下面的示例中,显示的函数返回列表“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?
将此元数据存储在用户定义的自定义表中而不是使用扩展属性会更明智吗?
答案 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%'
搜索不区分大小写。