如何在SQL Server 2012中的10个不同节点中转换此字符串?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL Server 2012中的10个不同节点中转换此字符串?相关的知识,希望对你有一定的参考价值。
我的字符串是=
[10, 1],[7, 3],[15, 4],[10, 1],[14, 1]
如何将其转换为10个不同的节点/值?我目前的尝试是这样的
select CAST('<A>'+REPLACE(REPLACE( REPLACE(REPLACE('[10, 1],[7, 3],[15, 4],[10, 1],[14, 1]', '[', ''), ']', ''),',',''),' ','</A><A>')+'</A>' AS XML) AS Data
答案=
<A>10</A><A>17</A><A>315</A><A>410</A><A>114</A><A>1</A>
我希望它在10个节点/值而不是上面。我应该如何在sql server 2012中做到这一点?
答案
评论太长了
select REPLACE(REPLACE(REPLACE(@data, '],[', ''), '[', ''), ']', '')
结果:
10, 17, 315, 410, 114, 1
编辑:
似乎你只是在寻找价值观
select LTRIM(REPLACE(REPLACE(a.value('.', 'VARCHAR(30)'), '[', ''), ']', '')) [Data] from
(
select CAST('<A>'+REPLACE('[10, 1],[7, 3],[15, 4],[10, 1],[14, 1]', ',', '</A><A>')+'</A>' AS xml) AS Data
)a cross apply Data.nodes ('/A') as split(a)
结果:
Data
10
1
7
3
15
4
10
1
14
1
另一答案
已经提供的答案似乎运作良好,但我考虑使用正则表达式更通用的(可能在更复杂的情况下工作):
- 安装sql-server-regex(例如for Sql Server 2014)
- 使用“拆分”方法
select Match from dbo.RegexSplit(@data, 'D') where Match <> ''
性能测试
我注意到使用CLR函数比REPLACE快得多,如下所示:
- 使用
RegexSplit
(1M元素约20秒)declare @baseMsg varchar(max) = '[10, 1],[7, 3],[15, 4],[10, 1],[14, 1],' declare @data varchar(max) = replicate(@baseMsg, 1000000) select Match from dbo.RegexSplit(@data, 'D') where Match <> ''
- 使用
REPLACE
(2K元素约15秒)declare @baseMsg varchar(max) = '[10, 1],[7, 3],[15, 4],[10, 1],[14, 1],' declare @data varchar(max) = replicate(@baseMsg, 200) select LTRIM(REPLACE(REPLACE(a.value('.', 'VARCHAR(30)'), '[', ''), ']', '')) [Data] from ( select CAST('<A>'+REPLACE(@data, ',', '</A><A>')+'</A>' AS xml) AS Data )a cross apply Data.nodes ('/A') as split(a)
所以,我们谈论的是三个数量级的差异。
当然,应该根据字符串长度,安全权限选择解决方案(可能不允许使用SQLCLR,或者在允许外部库在SQL Server中运行之前必须对其进行分析)。
另一答案
我找到了答案,SQL应该如下:
select CAST('<A>'+REPLACE(REPLACE( REPLACE(
REPLACE('[10, 1],[7, 3],[15, 4],[10, 1],[14, 1]', '[', ''),
']', ' '),
',',''),
' ','</A><A>') +'</A>' AS XML) AS Data
以上是关于如何在SQL Server 2012中的10个不同节点中转换此字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何从MS SQL Server 2012中的不同表中减去连续的行?
如何把高版本的sqlserver 还原到低版本的 sqlserver