从具有指定列名SQL Server的所有表和所有数据库中查找列名

时间:2015-01-07 21:31:36

标签: sql sql-server database

我有几个数据库,我想从所有数据库中找到包含所有表的列名。

此查询仅提供了来自一个数据库的所有表的列表,但我希望所有数据库名称都包含所有表名

SELECT 
    t.name,c.name 
FROM 
    sys.tables t 
INNER JOIN 
    sys.columns c  ON c.object_id = t.object_id 
WHERE 
    c.name LIKE '%CUSTOMERID%'

由于

2 个答案:

答案 0 :(得分:2)

sp_foreachdb有时会跳过数据库。请记住,这是一个未记录的系统过程,因此可能存在错误。对于这样的事情,我更喜欢一些动态的SQL。它没有比未记录的光标多得多的代码,但它更准确。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'SELECT ''' + d.name + ''' as DatabaseName, t.name as TableName, c.name as ColumnName FROM ' + d.name + '.sys.tables t inner join ' + d.name + '.sys.columns c  ON c.object_id = t.object_id WHERE c.name LIKE ''%CUSTOMERID%'' union all '
from sys.databases d
where d.name not in('master', 'tempdb', 'msdb', 'model', 'ReportServer', 'ReportServerTempDB')

set @SQL = left(@SQL, len(@SQL) - 10)

exec sp_executesql @SQL

答案 1 :(得分:0)

使用

exec sp_msforeachdb

示例:

exec sp_msforeachdb 'use ? select top 10 * from sys.tables'

它基本上在每个数据库上执行动态sql语句。 '?'字符被它迭代的当前数据库替换。小心使用。