如何从匹配'%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
相关产品推荐
相关产品推荐

