1

私のクエリでは、次のような iSeries メッセージ キューからの文字列を含む数百のレコードがあります。

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'

文字列は残高まで固定長であるため、アカウントを簡単に取得できますが、返された文字列を分割して、 0とおそらく999999の間で異なるSUBSTRING(MQ_Message,92,30)残高部分を取得する必要があります(ペンス!)17017362

CHARINDEX を使用して考えられるあらゆる組み合わせを試した結果、バランスを取るのに本当に苦労しました。

これを行う最善の方法は何ですか?

4

1 に答える 1

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)
于 2016-03-08T18:41:20.643 に答える