如何将多组动态查询结果合并至单个现有表?
看起来你现在的问题是原来的动态SQL会输出12个独立的结果集,但你需要把这些结果合并到单个现有表里,而不是分散的结果。我来给你几个可行的解决方案:
首先,先理清楚你原来的逻辑:每次循环生成一个只包含heX列的查询,其中只有hr=1的那一行会有值X,其他行都是NULL。现在要把这12个列的结果合并到同一个表中,完全不需要循环执行12次EXEC,我们可以一次性完成这个操作。
方案1:手动构造静态SQL(适合列数少的情况)
如果你的列数只有12个,手动写SQL反而更简单直接。假设你的目标表叫target_table,已经包含he1到he12这些列(如果还没有,先创建它):
-- 先创建目标表(如果不存在的话) IF NOT EXISTS(SELECT * FROM sysobjects WHERE name='target_table') CREATE TABLE target_table ( he1 INT, he2 INT, he3 INT, he4 INT, he5 INT, he6 INT, he7 INT, he8 INT, he9 INT, he10 INT, he11 INT, he12 INT ) -- 一次性插入所有列的数据到目标表 INSERT INTO target_table (he1, he2, he3, he4, he5, he6, he7, he8, he9, he10, he11, he12) SELECT CASE WHEN hr = 1 THEN 1 END AS he1, CASE WHEN hr = 1 THEN 2 END AS he2, CASE WHEN hr = 1 THEN 3 END AS he3, CASE WHEN hr = 1 THEN 4 END AS he4, CASE WHEN hr = 1 THEN 5 END AS he5, CASE WHEN hr = 1 THEN 6 END AS he6, CASE WHEN hr = 1 THEN 7 END AS he7, CASE WHEN hr = 1 THEN 8 END AS he8, CASE WHEN hr = 1 THEN 9 END AS he9, CASE WHEN hr = 1 THEN 10 END AS he10, CASE WHEN hr = 1 THEN 11 END AS he11, CASE WHEN hr = 1 THEN 12 END AS he12 FROM hrs
执行这段SQL后,target_table里就会包含所有12列的数据,而不是12个独立的结果集。
方案2:动态SQL构造(适合列数多的情况)
如果以后列数可能增加,不想手动写那么多CASE语句,可以用动态SQL一次性构造完整的插入语句:
DECLARE @sql NVARCHAR(MAX) = '' DECLARE @cnt1 INT = 1 DECLARE @columns NVARCHAR(MAX) = '' -- 先构造列名列表(用于INSERT的字段部分) WHILE @cnt1 <=12 BEGIN SET @columns = @columns + ', he' + CAST(@cnt1 AS NVARCHAR) SET @cnt1 = @cnt1 +1 END SET @columns = STUFF(@columns, 1, 2, '') -- 去掉开头的逗号 -- 重置计数器,构造SELECT部分的列逻辑 SET @cnt1 = 1 WHILE @cnt1 <=12 BEGIN SET @sql = @sql + ', CASE WHEN hr = 1 THEN ' + CAST(@cnt1 AS NVARCHAR) + ' END AS he' + CAST(@cnt1 AS NVARCHAR) SET @cnt1 = @cnt1 +1 END SET @sql = STUFF(@sql, 1, 2, '') -- 去掉开头的逗号 -- 拼接成完整的INSERT语句 SET @sql = 'INSERT INTO target_table (' + @columns + ') SELECT ' + @sql + ' FROM hrs' -- 执行动态SQL EXEC sp_executesql @sql
这段代码会自动生成包含所有12列的插入语句,执行后同样只会把数据插入到目标表中,不会生成多个结果集。
为什么原来的方法会生成多个结果集?
你原来的循环每次调用EXEC都会执行一次独立的SELECT查询,每个查询只返回一个列,所以SQL Server会为每个查询返回一个单独的结果集。而上面的两种方法都是把所有列放到同一个SELECT语句里,所以只会生成一个结果(或者直接插入到表中,不会返回结果集,除非你主动查询目标表)。
内容的提问来源于stack exchange,提问作者V.Deep
相关产品推荐
相关产品推荐

