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

如何从匹配'%Project%'的多表中分别获取数据(不关联/合并)

解决方案

要逐个获取所有匹配%Project%的表的全部数据,且不进行关联或合并,你需要使用动态SQL——静态SQL无法动态指定不同表名执行查询。以下是两种实用的实现方式:

方式一:基于ROW_NUMBER的循环(兼容你原代码逻辑)

DECLARE @count INT, @tableName NVARCHAR(128), @sql NVARCHAR(MAX)

-- 获取匹配表的总数
SET @count = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%Project%')

WHILE (@count != 0)
BEGIN
    -- 获取当前循环对应的表名
    SELECT @tableName = TABLE_NAME
    FROM (
        SELECT TABLE_NAME, ROW_NUMBER() OVER (ORDER BY TABLE_NAME) AS row_number
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME LIKE '%Project%'
    ) AS sub
    WHERE row_number = @count

    -- 构建动态SQL并执行,查询该表全部数据
    SET @sql = N'SELECT * FROM ' + QUOTENAME(@tableName)
    EXEC sp_executesql @sql

    SET @count = @count - 1
END

方式二:游标遍历(更直观的表名遍历方式)

DECLARE @tableName NVARCHAR(128), @sql NVARCHAR(MAX)

-- 声明游标,获取所有匹配的表名
DECLARE tableCursor CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '%Project%'
ORDER BY TABLE_NAME

-- 打开游标并开始遍历
OPEN tableCursor
FETCH NEXT FROM tableCursor INTO @tableName

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 构建并执行动态SQL
    SET @sql = N'SELECT * FROM ' + QUOTENAME(@tableName)
    EXEC sp_executesql @sql

    -- 读取下一个表名
    FETCH NEXT FROM tableCursor INTO @tableName
END

-- 清理游标资源
CLOSE tableCursor
DEALLOCATE tableCursor

关键说明:

  • QUOTENAME(@tableName)用于处理表名含特殊字符(空格、关键字等)的情况,避免SQL语法错误。
  • sp_executesql是SQL Server推荐的动态SQL执行方式,比EXEC()更安全,也支持参数化(此处无需参数,但属于规范写法)。
  • 两种方式都会为每个表单独返回一个结果集,完全满足你不关联、不合并的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:22:01