如何在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
另一答案

已经提供的答案似乎运作良好,但我考虑使用正则表达式更通用的(可能在更复杂的情况下工作):

  1. 安装sql-server-regex(例如for Sql Server 2014
  2. 使用“拆分”方法 select Match from dbo.RegexSplit(@data, 'D') where Match <> ''

性能测试

我注意到使用CLR函数比REPLACE快得多,如下所示:

  1. 使用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 <> ''
  2. 使用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中的不同表中减去连续的行?

处理 SQL Server 2012 表中的空间数据类型

如何把高版本的sqlserver 还原到低版本的 sqlserver

如何连接到 SQL Server Compact 3.5 文件作为 Visual Studio 2012 中的数据源?

sql server 语句如何将3个表合并成一个表?

如何在 SQL Server CE 数据库中插入多行? [关闭]