SQL Server/T-SQL无UDF实现多记录字段合并为单字符串
嘿,我来帮你搞定这个多行字符串合并的问题!你提到想用WHILE循环实现,那先给你演示这个方案,另外也给你推荐几个更高效的常用方法,毕竟WHILE循环在大数据量下性能可能不太理想~
方法一:WHILE循环实现(你提到的变体方案)
这是你推测的思路,我补全了测试代码并加上完整的循环逻辑:
-- 创建临时测试表 create table #temp (id int, myString varchar(max)); insert into #temp values (1,'This'); insert into #temp values (2,'is'); insert into #temp values (3,'a'); insert into #temp values (4,'test!'); -- 初始化变量:存储最终结果、当前遍历的ID、当前行的字符串 DECLARE @Result VARCHAR(MAX) = ''; DECLARE @CurrentID INT; DECLARE @CurrentString VARCHAR(MAX); -- 从最小的ID开始遍历 SELECT @CurrentID = MIN(ID) FROM #temp; WHILE @CurrentID IS NOT NULL BEGIN -- 获取当前ID对应的字符串 SELECT @CurrentString = myString FROM #temp WHERE ID = @CurrentID; -- 拼接字符串,注意处理开头的空格(避免结果前出现多余空格) SET @Result = @Result + CASE WHEN @Result <> '' THEN ' ' ELSE '' END + @CurrentString; -- 获取下一个要遍历的ID(比当前ID大的最小ID) SELECT @CurrentID = MIN(ID) FROM #temp WHERE ID > @CurrentID; END -- 输出合并后的结果 SELECT @Result AS MergedString; -- 清理临时表 DROP TABLE #temp;
执行这段代码后,就能得到你想要的This is a test!结果。这个方法的逻辑就是逐行遍历表中按ID排序的记录,逐步拼接字符串。
方法二:STRING_AGG(SQL Server 2017及以上版本推荐)
如果你使用的是SQL Server 2017或更高版本,强烈推荐用这个内置函数,代码简洁且性能最优:
create table #temp (id int, myString varchar(max)); insert into #temp values (1,'This'); insert into #temp values (2,'is'); insert into #temp values (3,'a'); insert into #temp values (4,'test!'); -- 直接用STRING_AGG聚合,指定分隔符为空格,按ID排序 SELECT STRING_AGG(myString, ' ') WITHIN GROUP (ORDER BY ID) AS MergedString FROM #temp; DROP TABLE #temp;
STRING_AGG是专门为字符串聚合设计的函数,WITHIN GROUP (ORDER BY ID)保证了拼接顺序和ID一致,完全满足你的需求。
方法三:STUFF + FOR XML PATH(兼容SQL Server 2016及更早版本)
如果你的SQL Server版本比较旧(2016及以前),可以用这个经典的兼容方案:
create table #temp (id int, myString varchar(max)); insert into #temp values (1,'This'); insert into #temp values (2,'is'); insert into #temp values (3,'a'); insert into #temp values (4,'test!'); SELECT STUFF( -- 用FOR XML PATH把每行字符串拼接成带空格的片段,TYPE转换为XML避免特殊字符转义 (SELECT ' ' + myString FROM #temp ORDER BY ID FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '' -- 去掉开头的第一个多余空格 ) AS MergedString; DROP TABLE #temp;
这个方法利用XML的特性实现字符串聚合,STUFF函数用来移除开头的第一个空格(因为第一个字符串前也被加了空格)。
小总结
- 新版本优先用
STRING_AGG,最省心高效; - 旧版本用
STUFF + FOR XML PATH; - WHILE循环适合小数据量或特殊定制场景,大数据量下性能不如前两种方法。
内容的提问来源于stack exchange,提问作者ashleedawg
相关产品推荐
相关产品推荐

