第52.1节 SQL Server 2008/2012/2014 使用 XML 拆分字符串
在没有 STRING_SPLIT 的旧版本,可借助 XML 实现拆分:
sql
SELECT split.a.value('.', 'VARCHAR(100)') AS Value
FROM (
SELECT CAST('<M>' + REPLACE('A|B|C', '|', '</M><M>') + '</M>' AS XML) AS Data
) AS A
CROSS APPLY Data.nodes('/M') AS split(a);
结果:
| Value |
|---|
| A |
| B |
| C |
第52.2节 SQL Server 2016 使用 STRING_SPLIT
2016 起提供内置函数 STRING_SPLIT。
参数:
- string:待拆分的字符表达式(varchar/nvarchar/nchar/char)
- separator:单字符分隔符(varchar(1)/nvarchar(1)/char(1)/nchar(1))
示例:
sql
SELECT value
FROM STRING_SPLIT('a,b,c', ',');
结果:
| value |
|---|
| a |
| b |
| c |
空字符串处理:
sql
SELECT value
FROM STRING_SPLIT('', ',');
| value |
|---|
去掉空元素:
sql
SELECT value
FROM STRING_SPLIT('a,,b,c', ',')
WHERE LTRIM(RTRIM(value)) <> '';
第52.3节 表变量与 XML 结合示例
sql
-- 构造表变量
DECLARE @userList TABLE (UserKey VARCHAR(60));
INSERT INTO @userList VALUES ('bill'), ('jcom'), ('others');
-- 生成 XML
DECLARE @text XML;
SET @text = (
SELECT UserKey
FROM @userList
FOR XML PATH('user'), ROOT('group')
);
-- 查看 XML 内容
SELECT @text;
XML 结果:
xml
<group>
<user><UserKey>bill</UserKey></user>
<user><UserKey>jcom</UserKey></user>
<user><UserKey>others</UserKey></user>
</group>