2013-08-22 2 views
2

Я хочу, чтобы разбить строку в этом формате Цитата :Как разбить строку в SQL Server 2008 с помощью хранимой процедуры и вставить данные в таблицу

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

. На самом деле эта строка является только образцом, моя оригинальная строка очень большая. я не понимаю, что если я сломаю эту строку, чем количество переменных, которые я должен сделать, чтобы захватить данные и после разделения строки, я хочу, чтобы она была вставлена ​​в таблицу данных, содержащую столбцы в качестве даты и возраста? Какую концепцию я использую? (Я получаю эту строку из веб-службы) Спасибо заранее.

+0

Просто предложение - строка захвата на веб-сервере или контроллере, напишите парсер для ваших данных. I.e один объект с датой, возрастом или другими свойствами, которые у вас есть, создайте коллекцию этих объектов и используйте объемную вставку в db. –

+0

Также строка поступает из веб-службы - есть ли способ форматирования как объекты JSon - http://msdn.microsoft.com/en-us/library/bb299886.aspx –

+0

эй, давайте держим его довольно просто, нет нужно JSON так далеко, как я думаю ... – RachitSharma

ответ

2

В общем, я бы предложил написать функцию CLR, которая разделяет строки по регулярному выражению или табличной функции SQL, но вы случае вы можете попробовать что-то простое, как преобразовать вашу строку в 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

+0

Спасибо, что ... действительно здорово! – RachitSharma

+0

привет, но он дает ошибку как «MSG 9410, уровень 16, состояние 1, строка 11 XML-синтаксический анализ: строка 1, символ 20964, ожидается пробел». – RachitSharma

+0

Можете ли вы предоставить строку, чтобы я мог ее протестировать? –

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 
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