在SQL Server上的多个数据库中搜索列名

时间:2016-12-19 21:41:55

标签: sql sql-server database sql-server-2008

我需要在同一个SQL Server 2008上的许多数据库中找到特定的列。我在互联网上尝试了很多解决方案,但没有一个比系统数据库更有效。扩展搜索以查看一台服务器上的所有数据库的最佳方法是什么?

1 个答案:

答案 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;

更新没有sp_MSforeachdb

的另一种方法
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