首页 > 解决方案 > 如何显示SQL Server中存在该列的数据库和表的列表

问题描述

我需要一个查询来扫描服务器上所有数据库中的所有表并返回是否存在列。我正在考虑使用sp_MSforeachdb系统过程在提供的特定数据库中进行扫描。

标签: sqlsql-server-2012

解决方案


sp_MSforeachdb如果未指定任何数据库,这将搜索特定数据库或所有数据库(从您的问题中不清楚,如果您只关心单个数据库,为什么要使用)。

DECLARE @column   nvarchar(128) = N'column name to search for',
        @database nvarchar(128) = NULL;

CREATE TABLE #results(db sysname, obj nvarchar(300), col nvarchar(128));

DECLARE @sql  nvarchar(max), 
        @exec nvarchar(4000), 
        @db   sysname,
        @c    cursor;

SET @sql = N'INSERT #results(db, obj, col)
  SELECT DB_NAME(), s.name + ''.'' + o.name
  FROM sys.schemas AS s
  INNER JOIN sys.objects AS o
    ON s.[schema_id] = o.[schema_id]
  INNER JOIN sys.columns AS c
    ON o.[object_id] = c.[object_id]
  WHERE c.name = @column;';

SET @c = cursor FORWARD_ONLY STATIC READ_ONLY FOR
  SELECT QUOTENAME(name) FROM sys.databases
  WHERE state = 0 AND database_id > 4 AND name = COALESCE(@database, name);

OPEN @c;
FETCH NEXT FROM @c INTO @db;

WHILE @@STATUS <> -1
BEGIN
  SET @exec = @db + N'.sys.sp_executesql';
  EXEC @exec @sql, N'@column nvarchar(128)', @column;
  FETCH NEXT FROM @c INTO @db;
END

SELECT db, obj, col FROM #results;

如果您经常跨数据库运行查询,请获取sp_ineachdb,它比未记录和不受支持的sp_MSforeachdb.


推荐阅读