如何在SQL Server 2014 Management Studio中检索实例下所有数据库的指定列?
解决SQL Server跨库查找指定列的问题
嘿,我懂你的困扰——你用INFORMATION_SCHEMA.COLUMNS查询SomeColumn没得到预期结果,但明明确认这个列存在某个数据库的表里对吧?问题出在这个视图只针对你当前连接的数据库生效,如果目标列不在当前库,自然查不到。下面给你几个靠谱的跨库查询方法,能直接返回包含列的数据库、表和架构信息:
方法1:使用系统存储过程sp_MSforeachdb遍历所有数据库
这个微软提供的存储过程可以自动遍历所有在线数据库,执行指定的查询语句,非常方便:
EXEC sp_MSforeachdb ' USE [?]; SELECT ''?'' AS [数据库名称], s.name AS [架构名称], t.name AS [表名称], c.name AS [列名称] FROM sys.tables t JOIN sys.columns c ON c.object_id = t.object_id JOIN sys.schemas s ON s.schema_id = t.schema_id WHERE c.name LIKE ''%SomeColumn%'' ';
- 解释:
?会被自动替换为每个数据库的名称,USE [?]会切换到对应的数据库,然后查询该库的系统视图,最终汇总所有包含目标列的结果。
方法2:手动编写动态SQL(更可控)
如果你不想依赖未公开的sp_MSforeachdb,可以手动拼接动态SQL来遍历数据库,还能灵活排除系统库或离线库:
DECLARE @SQL NVARCHAR(MAX) = ''; SELECT @SQL += ' USE [' + QUOTENAME(d.name) + ']; SELECT ''' + d.name + ''' AS [数据库名称], s.name AS [架构名称], t.name AS [表名称], c.name AS [列名称] FROM sys.tables t JOIN sys.columns c ON c.object_id = t.object_id JOIN sys.schemas s ON s.schema_id = t.schema_id WHERE c.name LIKE ''%SomeColumn%''; ' FROM sys.databases d WHERE d.state_desc = 'ONLINE' -- 只查询在线的数据库 AND d.name NOT IN ('master', 'model', 'msdb', 'tempdb') -- 可选:排除系统数据库 EXEC sp_executesql @SQL;
- 解释:这段代码会先遍历所有符合条件的数据库,拼接每个库的查询语句,最后一次性执行所有查询,返回汇总结果。
补充:为什么原来的查询没结果?
INFORMATION_SCHEMA.COLUMNS是数据库本地的视图,它只会返回当前连接数据库中的列信息。如果你知道目标列所在的数据库,先执行USE 目标数据库名称;,再运行原来的查询,就能得到结果了:
USE YourTargetDatabase; SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%SomeColumn%';
注意事项
- 确保你有足够的权限:需要具备访问目标数据库系统视图的权限(比如
VIEW DEFINITION或数据库的SELECT权限)。 - 如果你的列名区分大小写,记得在查询前设置
SET CASE_INSENSITIVE_IDENTIFIERS OFF;(不过SQL Server默认是不区分大小写的)。
内容的提问来源于stack exchange,提问作者Chris K
相关产品推荐
相关产品推荐

