1. 简介
在MSSQL中,拼接多行数据是一个重要的场景,常用于数据统计、数据传输等场合。本文将介绍一种常用的方法,通过使用STUFF和FOR XML PATH函数拼接多行数据。
2. 函数介绍
2.1 STUFF函数
STUFF函数用于替换字符串的一部分,可以在另一个字符串的指定位置插入一个新字符串。STUFF函数的语法如下:
STUFF(char_expression, start, length, replaceWith_expression)
其中,char_expression表示原始字符串;start表示要替换的起始位置;length表示要替换的长度;replaceWith_expression表示用于替换的新字符串。
2.2 FOR XML PATH函数
FOR XML PATH函数用于将查询结果以XML格式进行返回。FOR XML PATH的语法如下:
SELECT column_name [, column_name ]
FROM table_name
FOR XML [ mode ] [, ELEMENTS [XSINIL] | PATH [XSINIL] ]
其中,mode表示XML返回模式,可以为AUTO、RAW、EXPLICIT、IMPLICIT等。ELEMENTS和PATH用于指定节点名称格式。
3. 拼接多行数据
3.1 准备数据
假设我们有以下的数据:
CREATE TABLE [dbo].[products](
[id] [int] NOT NULL,
[name] [nvarchar](50) NOT NULL,
[category] [nvarchar](50) NOT NULL,
[price] [money] NOT NULL
)
INSERT INTO [dbo].[products]([id], [name], [category], [price])
VALUES
(1, 'Product A', 'Electronic', 10.00),
(2, 'Product B', 'Electronic', 20.00),
(3, 'Product C', 'Food', 5.00),
(4, 'Product D', 'Food', 7.00),
(5, 'Product E', 'Office', 3.00)
我们需要将产品按照分类拼接成一行数据,其中同一类别的产品名称之间用分号(;)隔开。
3.2 使用STUFF和FOR XML PATH拼接数据
对于本例的需求,我们可以使用STUFF和FOR XML PATH函数拼接数据,代码如下:
SELECT DISTINCT category,
STUFF((SELECT '; ' + name
FROM dbo.products
WHERE (category = p.category)
FOR XML PATH ('')), 1, 2, '') AS Products
FROM [dbo].[products] p
运行以上代码,将返回以下结果:
category Products
----------- -------------------------------------------------
Electronic Product A; Product B
Food Product C; Product D
Office Product E
以上代码的工作原理是:使用子查询获取同一类别的产品名称,用STUFF函数将产品名称拼接成一行,并用FOR XML PATH函数生成XML格式的数据,在返回结果中去除XML标记。
4. 总结
拼接多行数据在实际开发中经常使用,本文介绍了使用STUFF和FOR XML PATH函数拼接多行数据的方法。以上代码仅作为示例,实际应用中需要根据具体的数据模型进行调整。