server多笔记录拼接字符串 sql_sqlserver 将多行数据查询合并为一条数据

本文介绍了如何在SQL Server中利用FOR XML PATH语句将多行数据合并为一条,以满足特定格式需求。通过示例展示了如何处理日期格式、去除标签以及使用STUFF函数去除多余的分隔符,最终实现查询结果中LOGDATES列的拼接展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天,每天会记录一条日志。在查询表T_FUN_TASK时,需将任务表中的 LOGDATE 查询出来作为一列 LOGDATES显示。

T_FUN_TASK

T_FUN_LOGBOOK

查询结果

此结果查询方法可以用存储过程轻松实现,这里我要介绍的是sqlserver FOR XML PATH语句的应用,在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据

且合并为一条数据,看以下示例:

SELECT LOGDATE FROM T_FUN_LOGBOOK WHERE TASKID=231 FOR XML PATH

结果为:

2014-01-06T00:00:00

2014-01-07T00:00:00

在前面的需求中,我是想要把这2条数据合并到一起且没有XML标签,条与条之间用下划线(_)分隔的,日期的格式也变为了2014/01/07的格式。下面来一步一步来完成需求。

首先,将日期格式转化为需要的格式:

SELECT CONVERT(VARCHAR(100), LOGDATE, 111) FROM T_FUN_LOGBOOK WHERE TASKID=231 FOR XML PATH

结果变为:

2014/01/06

2014/01/07

可以发现,转化字符卷的过程中,把logdate标签给去掉了。现在我们要去掉标签:

SELECT CONVERT(VAR

### SQL Server 字符串拼接方法 #### 使用 `STRING_AGG()` 函数 `STRING_AGG()` 是一种聚合函数,能够将多行字符串合并成单个字符串,并允许指定分隔符。此功能自 SQL Server 2017 版本起可用。 ```sql SELECT STRING_AAG(column_name, ', ') AS concatenated_string FROM table_name; ``` 上述查询会把表内某一列的数据项通过逗号加空格的形式连接起来形成新的字段[^1]。 #### 动态SQL中的字符串拼接 当涉及到动态SQL时,在构建最终执行的命令之前可能需要先组合一些部分。下面是一个简单的例子展示了怎样创建并运行一条基于输入参数而变化的选择语句: ```sql CREATE PROCEDURE Test @TestID INT AS BEGIN DECLARE @s NVARCHAR(MAX); SET @s = 'SELECT * FROM dbo.Categories WHERE CategoryID=''' + CAST(@TestID AS VARCHAR) + ''''; PRINT @s; -- 显示生成后的SQL语句 EXEC (@s); -- 执行该SQL语句 END; ``` 这段脚本定义了一个名为 `Test` 的存储过程,它接受一个整数类型的参数来过滤特定类别的记录[^3]。 #### 利用 `STUFF()` 和 `FOR XML PATH('')` 对于较早版本的SQL Server 或者其他场景下不支持 `STRING_AGG()` ,则可以采用 `STUFF()` 结合 `FOR XML PATH('')` 来实现类似的效果。这里给出一段示范代码用来获取所有名称之间由连字符相连的结果集: ```sql SELECT STUFF(( SELECT '-' + NAME FROM TABLENAME FOR XML PATH('') ), 1, 1, '') AS SPLITNAME; ``` 这里的技巧在于利用了XML路径表达式的特性以及 `STUFF()` 方法去除多余的前缀符号[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值