用空格正确分割字符串列

时间:2016-03-08 18:14:28

标签: sql-server sql-server-2008 tsql tokenize charindex

在我的查询中,我有几百条带有来自iSeries Message Queue的字符串的记录,如下所示:

006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0

我需要在结果中显示帐号部分12345678和余额部分17017362

我试过了:

SELECT MQ_Message
, SUBSTRING(MQ_Message,92,30) -- = 12345678 17017362 0 
, SUBSTRING(MQ_Message,92,8) -- = 12345678  , SUBSTRING(MQ_Message,100, CHarIndex(' ',  SUBSTRING('006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',92,20)) )
, CHarIndex(' ',  SUBSTRING('006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',99,20)) 
, CHARINDEX(' ','17017362 0 0')
    from outboundMessages WHERE message_Type = '006'

我可以轻松地获得该帐户,因为字符串的长度固定为余额,但我需要拆分SUBSTRING(MQ_Message,92,30)返回的字符串并从中获取余额部分{{1并且 0 999999 之间会有所不同(以便士!)

在尝试使用CHARINDEX的所有可能组合时,我真的很难找到平衡。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

DECLARE @string NVARCHAR(MAX) =  '006 1 AccountSetBalance 0000000000 EQ 2016-03-01-18.45.42.002000 0038882665 _ 123456 12345612345678 17017362 0 0',
        @xml xml

select @xml = cast('<d><q>'+REPLACE(@string,' ','</q><q>')+'</q></d>' as xml)

SELECT n.v.value('q[9]','integer'),
       n.v.value('q[11]','integer')
FROM @xml.nodes('/d') AS n(v);

结果:

----------- -----------
123456      17017362

(1 row(s) affected)