【问题标题】:How to display the list of databases and tables where the column exists in SQL Server如何显示SQL Server中存在该列的数据库和表的列表
【发布时间】:2021-12-12 08:18:28
【问题描述】:

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

【问题讨论】:

  • 查询sys.columns
  • 但是,我需要 DBName.Table
  • 配合sp_MSforeachdb使用
  • 我可以知道链接 sys.tables 和 sys.databases 的关键是什么吗?在那种情况下,我可以得到像 DBName.Table 的全名
  • object_id 或简单的object_name(object_id) 将为您提供表名

标签: sql sql-server-2012


【解决方案1】:

如果没有指定,这将搜索特定数据库或所有数据库(从你的问题中不清楚为什么你想使用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;

如果您经常跨数据库运行查询,请get sp_ineachdb,它比未记录和不受支持的sp_MSforeachdb 功能更多(而且错误更少!)。

【讨论】:

    猜你喜欢
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多