SQL Server/T-SQL如何用游标声明数据库变量实现多库循环查询?
你需要使用动态SQL来实现将变量作为数据库名执行查询的需求,你原有代码的查询逻辑存在语法错误,无法直接使用变量指代数据库对象,修正后的可运行代码如下:
DECLARE @cursor_db CURSOR, @database_name VARCHAR(255), @sql NVARCHAR(MAX) -- 游标加FAST_FORWARD优化只读遍历性能 SET @cursor_db = CURSOR FAST_FORWARD FOR SELECT name FROM sys.databases WHERE name LIKE 'Company%' -- 可额外加过滤条件,比如 AND state = 0 仅查询在线状态的数据库 OPEN @cursor_db; FETCH NEXT FROM @cursor_db INTO @database_name; WHILE @@FETCH_STATUS = 0 BEGIN PRINT '正在查询数据库:' + @database_name -- 拼接动态SQL,示例为查询当前库中所有列名包含Orders的表、列信息 SET @sql = N' SELECT ''' + @database_name + N''' AS 数据库名, t.name AS 表名, c.name AS 列名 FROM ' + QUOTENAME(@database_name) + N'.sys.tables t INNER JOIN ' + QUOTENAME(@database_name) + N'.sys.columns c ON t.object_id = c.object_id WHERE c.name LIKE ''%Orders%'' ' -- 执行动态SQL EXEC sp_executesql @sql FETCH NEXT FROM @cursor_db INTO @database_name; END; CLOSE @cursor_db; DEALLOCATE @cursor_db;
关键注意事项:
- 必须使用
QUOTENAME()包裹变量转化的数据库名,既可以兼容带特殊字符、空格的库名,也能避免SQL注入风险 - 动态SQL里的单引号需要转义,用两个单引号代替一个单引号
- 如果你需要执行其他查询逻辑,只需要修改
@sql变量的拼接内容即可,跨库查询的表格式为QUOTENAME(库名).schema名.表名,默认schema为dbo时可以写成QUOTENAME(库名).dbo.表名 - 游标加上
FAST_FORWARD参数可以大幅提升只读遍历的性能,适合这种不需要回滚、不需要修改的遍历场景
内容的提问来源于stack exchange,提问作者mcr.netcore
相关产品推荐
相关产品推荐

