sql - 如何显示SQL Server中存在该列的数据库和表的列表
问题描述
我需要一个查询来扫描服务器上所有数据库中的所有表并返回是否存在列。我正在考虑使用sp_MSforeachdb
系统过程在提供的特定数据库中进行扫描。
解决方案
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
.
推荐阅读
- api - 当 API 不支持偏移时如何从偏移中获取结果(HERE Maps API)
- haskell - 定义为“数据 BB a = L | K (BB a) a (BB a) deriving (Show)”的树的 Haskell 预序树遍历
- assembly - 使用 (1,2,4,8) 大小的变量进行内存寻址
- javascript - 选项卡和图像定时更改
- java - 为什么在使用 Arrays.binarySearch 时需要使用偏移量?
- python - 自定义用户模型表没有名为 is_staff 的列
- php - 输入类型编号作为下拉列表
- javascript - 异步显示一个 POST
- javascript - 拍卖模式 mongodb
- mongodb - 嵌套对象上的 MongoDB 唯一索引