如何在SQL Server 2012中的10个不同节点中转换此字符串?

时间:2017-12-13 09:12:22

标签: sql sql-server xml sql-server-2012

My String is =

[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中做到这一点?

3 个答案:

答案 0 :(得分:1)

评论太长了

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 :(得分:1)

已经提供的答案似乎运作良好,但我想到了一个使用正则表达式的更通用的(可能在更复杂的场景中工作):

  1. 安装sql-server-regex(例如for Sql Server 2014

  2. 使用“拆分”方法

    select Match from dbo.RegexSplit(@data, '\D') where Match <> ''
    
  3. 性能测试

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

    1. 使用RegexSplit约20秒,1M元素

      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大约15s用于2K元素

      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)
      
    3. 所以,我们谈论的是三个数量级的差异。

      当然,应根据字符串长度,安全权限选择解决方案(可能不允许使用SQLCLR,或者必须先分析外部库,然后才能在SQL Server中运行)。

答案 2 :(得分:0)

我找到了答案,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