You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:24:03