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

如何在SQL Server的多个同结构数据库中一次性执行查询?

一次性查询SQL Server中多个同结构数据库的方法

当然可以一次性在所有同结构的客户数据库上执行查询!这里有两种实用的方法,分别对应不同的结果展示需求:

方法1:合并所有结果并标注来源数据库

这种方法会把所有数据库的查询结果合并成一个数据集,每一行都会带上对应的数据库名称,方便后续筛选或分析:

DECLARE @SQL NVARCHAR(MAX) = ''

-- 拼接每个客户数据库的查询语句
SELECT @SQL = @SQL + '
USE [' + name + ']
SELECT ''' + name + ''' AS DatabaseName, * FROM Loggin.NLog WHERE messages LIKE ''%error%''
UNION ALL'
FROM sys.databases
WHERE name LIKE 'Customer%' -- 匹配所有以Customer开头的数据库

-- 移除最后多余的UNION ALL
SET @SQL = LEFT(@SQL, LEN(@SQL) - 10)

-- 执行动态生成的SQL
EXEC sp_executesql @SQL

执行后你会得到类似这样的结果:

DatabaseName...(NLog表的其他字段)
CustomerA错误内容1
CustomerA错误内容2
CustomerB错误内容3

方法2:分库展示查询结果

如果你希望先显示CustomerA的所有错误行,再显示CustomerB的(和你期望的格式完全匹配),可以用游标循环逐个执行查询:

DECLARE @DBName NVARCHAR(128)

-- 定义游标,获取所有目标数据库名
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE name LIKE 'Customer%'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DBName

-- 循环处理每个数据库
WHILE @@FETCH_STATUS = 0
BEGIN
    -- 打印数据库名称作为分隔符
    PRINT '=== 来自 ' + @DBName + ' 的错误日志 ==='
    -- 执行当前数据库的查询
    EXEC('USE [' + @DBName + ']; SELECT * FROM Loggin.NLog WHERE messages LIKE ''%error%''')
    FETCH NEXT FROM db_cursor INTO @DBName
END

-- 清理游标
CLOSE db_cursor
DEALLOCATE db_cursor

执行后结果会按数据库分块显示:

=== 来自 CustomerA 的错误日志 ===
(这里是CustomerA的错误行)
=== 来自 CustomerB 的错误日志 ===
(这里是CustomerB的错误行)

注意事项

  • 确保执行脚本的账号对所有Customer*数据库拥有SELECT权限,同时能访问系统视图sys.databases
  • 如果你的数据库名称包含特殊字符(比如空格、下划线以外的符号),代码中用[和]包裹数据库名的写法能避免语法错误
  • 要是你不需要匹配所有前缀为Customer的数据库,可把WHERE name LIKE 'Customer%'改成WHERE name IN ('CustomerA','CustomerB','CustomerC')来指定具体数据库

内容的提问来源于stack exchange,提问作者TheBoubou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:23:22