2013-08-22 43 views
2

我想在這個格式 報價來分割字符串:如何使用存儲過程拆分SQL Server 2008中的字符串和數據插入到表

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

。 其實這個字符串只是一個樣本,我的原始字符串非常大。我沒有得到一個觀點,如果我打破了這個字符串,而不是分割字符串後我需要做的多少個變量來捕獲數據,我想將它插入到包含日期和年齡列的數據表中?我使用什麼樣的概念?(我正在從Web服務獲取此字符串)在此先感謝..

+0

只是一個建議 - 在Web /控制器上捕獲字符串,爲您的數據編寫一個解析器,即一個具有日期,年齡或其他屬性的對象,創建此對象的集合並使用批量插入到數據庫。 –

+0

此外字符串來自一個Web服務 - 有什麼辦法格式化爲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 
相關問題