2

この形式の文字列を分割したい 見積もり:

"date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8"

. 実際、この文字列は、元の文字列が非常に大きいサンプル 1 にすぎません。この文字列を分割した場合、日付と年齢の列を含むデータテーブルに挿入したい文字列を分割した後、データをキャプチャするために必要な変数の数よりも多くの変数を作成する必要があるという点がわかりませんか? どのような概念を使用しますか? (Web サービスからこの文字列を取得しています) よろしくお願いします..

4

3 に答える 3

2

一般に、正規表現または SQL テーブル値関数によって文字列を分割する CLR 関数を作成することをお勧めしますが、その場合は、文字列を xml に変換して解析するなどの簡単なことを試すことができます。

declare @str nvarchar(max) = 'date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8'
declare @data xml

select @str = replace(@str, '=', '="')
select @str = replace(@str, '|', '" ')
select @str = replace(@str, '^', '"/><row ')
select @str = '<row ' + @str + '"/>'

select @data = cast(@str as xml)

select
    t.c.value('@date', 'nvarchar(max)') as [date],
    t.c.value('@age', 'nvarchar(max)') as [age]
from @data.nodes('row') as t(c)

sql fiddle demo

于 2013-08-22T12:21:24.013 に答える
0
DECLARE @s VARCHAR(300)
SET @s = 'RELGENINS|1121232243434|343434343434|343434-683211|34343434.00|CIT|22297568|NA|INR|ONDIRECT|NA|NA|NA|22-03-2014 10:43:20|0300|NA|NA|NA|NA|NA|NA|NA|NA|NA|Success|1790153891'

DECLARE @tmp TABLE(   aDate varchar(50))

;WITH MyRows AS
(
    SELECT LEFT(@s, CHARINDEX('|', @s) -1) AS MyRow, RIGHT(@s, LEN(@s) - CHARINDEX('|', @s)) AS Remainder

    UNION ALL
    SELECT LEFT(Remainder, CHARINDEX('|', Remainder) -1) AS MyRow, RIGHT(Remainder, LEN(Remainder) - CHARINDEX('|', Remainder)) AS Remainder
    FROM MyRows
    WHERE CHARINDEX('|', Remainder)>0
    UNION ALL
    SELECT Remainder AS MyRow, NULL AS Remainder
    FROM MyRows
    WHERE CHARINDEX('|', Remainder)=0
)
INSERT INTO @tmp (aDate)
SELECT  SUBSTRING(MyRow, 0, 20) as date
FROM MyRows

SELECT *
FROM @tmp 
于 2014-05-14T13:17:37.240 に答える
0

これを試して:

Declare @stringToSplit varchar(max)='date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8^date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8^date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8^date=10/10/2000|age=13^date=01/01/2001|age=12^date=02/02/2005|age=8'

DECLARE @YourTable table (RowID int, Layout varchar(max))
INSERT @YourTable VALUES (1,@stringToSplit)

;WITH SplitSting AS
(
    SELECT
    RowID,LEFT(Layout,CHARINDEX('^',Layout)-1) AS Part
   ,RIGHT(Layout,LEN(Layout)-CHARINDEX('^',Layout)) AS Remainder
    FROM @YourTable
    WHERE Layout IS NOT NULL AND CHARINDEX('^',Layout)>0
    UNION ALL
    SELECT
    RowID,LEFT(Remainder,CHARINDEX('^',Remainder)-1)
   ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX('^',Remainder))
    FROM SplitSting
    WHERE Remainder IS NOT NULL AND CHARINDEX('^',Remainder)>0
    UNION ALL
    SELECT
    RowID,Remainder,null
    FROM SplitSting
    WHERE Remainder IS NOT NULL AND CHARINDEX('^',Remainder)=0

)

select SUBSTRING(part,CHARINDEX('=',part)+1,(CHARINDEX('|',part)-CHARINDEX('=',part))-1) as [Date],RIGHT(part,CHARINDEX('=',reverse(part))-1) as [Age] from SplitSting
于 2013-08-22T12:34:58.050 に答える