How to split a string in sql server 2008 using stored procedure and insert the data to table

后端 未结 3 1962
盖世英雄少女心
盖世英雄少女心 2021-01-15 08:13

I want to split a string in this format Quote:

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

. Actually this stri

相关标签:
3条回答
  • 2021-01-15 08:29

    try this:

    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 讨论(0)
  • 2021-01-15 08:37
    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 
    
    0 讨论(0)
  • 2021-01-15 08:47

    In general, I'd suggest to write a CLR function which split strings by regex or SQL table-valued function, but in you case you can try something simple like converting your string to xml and parsing it:

    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 讨论(0)
提交回复
热议问题