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

Find a column name from all tables and all databases with specified column name SQL Server

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

这个查询只给我一个数据库中所有表的列表,但我想要所有数据库名称和所有表名称

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

谢谢

使用

exec sp_msforeachdb

示例:

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

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

有时 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