我有几个数据库,我想从所有数据库中找到包含所有表的列名。
此查询仅提供了来自一个数据库的所有表的列表,但我希望所有数据库名称都包含所有表名
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%'
由于
答案 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语句。 '?'字符被它迭代的当前数据库替换。小心使用。