首先,我们要了解一下两个SQL语法
1. FOR XML PATH
FOR XML PATH 可以将查询结果根据行输出成XML各式
SELECT USER_ID FROM test FOR XML PATH
表结构:
执行结果:
<row>
<USER_ID>1</USER_ID>
</row>
<row>
<USER_ID>2</USER_ID>
</row>
......
我们可以通过赋值参数修改行节点的名称,通过AS修改列节点
SELECT USER_ID AS user_num FROM test FOR XML PATH('test')
执行结果:
<!-- 行节点 -->
<test>
<!-- 列节点 -->
<user_num>1</user_num>
</test>
<test>
<user_num>2</user_num>
</test>
......
而当FOR XML PATH(’’)时就可以去除行节点
SELECT USER_ID FROM test FOR XML PATH('')
执行结果:
<USER_ID>1</USER_ID>
<USER_ID>2</USER_ID>
......
修改列节点样式
SELECT ',' + USER_ID FROM test FOR XML PATH('')
执行结果:
,1,2,......
到这里我们就已经有了一个字符集拼接的雏形了
**2. STUFF函数 **
STUFF ( character_expression , start , length ,replaceWith_expression)
删除指定长度的字符,并在指定的起点处插入另一组字符
参数 | 说 明 |
---|---|
character_expression | 由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。 |
start | 整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。 |
length | 整形值,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。 |
replaceWith_expression | 用于替换的字符串 |
由此,我们就可以利用STUFF函数替换掉FOR XML PATH处理所得执行结果的第一个“,”
3. 结合
SELECT STUFF((SELECT ',' + USER_ID FROM test for xml path('')),1,1,'');
执行结果:
1,2,......