我需要在同一个SQL Server 2008上的许多数据库中找到特定的列。我在互联网上尝试了很多解决方案,但没有一个比系统数据库更有效。扩展搜索以查看一台服务器上的所有数据库的最佳方法是什么?
答案 0 :(得分:4)
试试这样:
此解决方案使用SP sp_MSforeachdb
。此SP允许您对现有数据库使用相同的语句。 Questionmark是实际数据库名称的占位符。
由于我们需要在单个表中得到结果,所以我先声明一个并使用INSERT INTO SomeTable EXEC SomeSP
- 语法将SP的结果插入到拟合表中(-variable):
注意此SP以跳过某些表而闻名。 Here's a thread to read more about this (including a solution for one special case)
DECLARE @ColumnName VARCHAR(100)='SomeColumnName';
DECLARE @Command VARCHAR(MAX)='USE [?]; SELECT TABLE_CATALOG
,TABLE_SCHEMA
,TABLE_NAME
,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME=''' + @ColumnName + ''';';
DECLARE @tbl TABLE(
TABLE_CATALOG VARCHAR(100)
,TABLE_SCHEMA VARCHAR(100)
,TABLE_NAME VARCHAR(100)
,COLUMN_NAME VARCHAR(100)
);
INSERT INTO @tbl
EXECUTE master.sys.sp_MSforeachdb @Command
SELECT * FROM @tbl;
DECLARE @ColumnName VARCHAR(100)='SomeColumnName';
DECLARE @Template VARCHAR(MAX)='USE ***; SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME=''' + @ColumnName + ''';';
DECLARE @Command VARCHAR(MAX)=
(
SELECT REPLACE(@Template,'***', QUOTENAME(name))
FROM sys.databases
FOR XML PATH('')
);
DECLARE @tbl TABLE(
TABLE_CATALOG VARCHAR(100)
,TABLE_SCHEMA VARCHAR(100)
,TABLE_NAME VARCHAR(100)
,COLUMN_NAME VARCHAR(100)
);
INSERT INTO @tbl
EXEC (@Command);
SELECT * FROM @tbl