从具有指定列名的所有表和所有数据库中查找列名 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
我有几个数据库,我想从我的所有数据库中的所有表中找到一个列名。
这个查询只给我一个数据库中所有表的列表,但我想要所有数据库名称和所有表名称
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