SQL Server 多行字段合并为单行的函数实现

苏见山
苏见山
发布时间:2026-10-15 | 6人浏览过
原创

本文介绍在 SQL Server 中如何将多个相关行的指定字段(如原因描述)合并为单一字符串,通过自定义函数配合 STUFF 函数消除拼接产生的多余分隔符。

实现原理与场景

在处理报表或汇总数据时,常需将关联的多条记录合并显示。例如,同一订单号下的多条物流异常原因需要汇总展示。核心思路是利用局部变量进行字符串累加,最后使用 STUFF 函数截取有效内容。

环境准备与测试数据

首先构建包含标准编号、数量及对应积压原因的临时表结构,并插入示例数据以验证逻辑。

第1步:创建测试表并插入数据

目的:建立基础数据结构,模拟多对一关系。
入口:SQL Server Management Studio (SSMS) 查询窗口。
动作:执行以下脚本创建表并填充测试用例,注意部分行存在相似但不同的堆积原因。

CREATE TABLE tb(
    standards varchar(50), 
    amount varchar(50), 
    variation varchar(50),
    statuss varchar(50), 
    Reason varchar(50)
);

-- 插入状态55的数据(同一标准多条原因)
INSERT INTO tb VALUES('55','279','4','物量积压','加工人员设备不足;T排制作进度较慢;');
INSERT INTO tb VALUES('55','279','4','物量积压','部件人员不足;');
INSERT INTO tb VALUES('55','279','4','物量积压','跨间场地积压;图纸问题较多;');

-- 插入状态56的数据(同一标准多条原因)
INSERT INTO tb VALUES('56','300','4','物量积压','AAAA;');
INSERT INTO tb VALUES('56','300','4','物量积压','BBBB;');
INSERT INTO tb VALUES('56','300','4','物量积压','CCCC;');

第2步:编写多行合并函数

目的:封装聚合逻辑,使主查询保持简洁。
入口:新建查询窗口。
动作:创建名为 test 的内联函数。利用 @re 变量遍历符合条件的所有行,将 Reason 字段前追加逗号后累加至末尾。关键点在于返回时使用 STUFF(@re, 1, 1, '') 删除第一个字符(即开头的额外逗号),从而获得干净的拼接字符串。

CREATE FUNCTION test(@standards varchar(100))
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @re varchar(500);
    SET @re = '';
    -- 字符串累积逻辑
    SELECT @re = @re + ',' + Reason
    FROM tb
    WHERE standards = @standards;
    
    -- 去除首个逗号并返回
    RETURN (STUFF(@re, 1, 1, ''));
END;

第3步:调用函数执行合并

目的:验证结果并将多行原因整合进主查询输出。
入口:查询窗口。
动作:在主查询中调用该函数,传入对应的 standards 值作为参数。使用 DISTINCT 确保非聚合列的唯一性,观察 Reason 列是否已成功合并。

-- 合并标准 '55' 的原因
SELECT DISTINCT standards, amount, variation, statuss, 
       Reason = dbo.test('55') 
FROM tb 
WHERE standards = '55';

-- 合并标准 '56' 的原因
SELECT DISTINCT standards, amount, variation, statuss, 
       Reason = dbo.test('56') 
FROM tb 
WHERE standards = '56';

注意事项与优化

  • 性能影响:此方法适用于数据量较小的场景。若涉及百万级大表,建议使用 SQL Server 2017+ 的 STRING_AGG() 函数替代自定义函数,性能更优且语法更简洁。
  • 分隔符处理:上述代码默认使用分号 ; 作为原字段内部结束符,拼接时增加逗号 , 区分不同行来源。可根据实际需求调整拼接符号。
  • 空值处理:如果某行 Reason 为空,可能导致多余逗号,建议在累加前增加 ISNULL 或条件判断。

以上就是 SQL Server 多行字段合并为单行的详细内容,更多关于 SQL Server 字符串处理与聚合函数的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表