• This one will handle the data even if one or more of the rows is incomplete:

    create table #Raw (

    ID int identity primary key,

    RawData varchar(100))

    insert into #Raw (rawdata)

    select parsed

    from common.dbo.stringparserxml('"S9000+"

    "UV+ 131.0000+ 0.0000"

    "UV+ 132.0000+ 0.0000"

    "UV+ 140.0000+ 0.0000"

    "UV+ 141.0000+ 0.0000"

    "UV+ 142.0000+ 0.0000"

    "UVN+ 524.0000+ 0.0000"

    "UVN+ 525.0000+ 0.0000"

    "UVN+ 527.0000+ 0.0000"

    "UVN+ 528.0000+ 0.0000

    "TLOV+2044.0000+ 0.0000"

    "TLOV+2045.0000+ 0.0000"

    "TLOV+2046.0000+ 0.0000"

    "TLOV+2047.0000+ 0.0000"

    "TLOV+2048.0000+ 0.0000"

    "TLOV+2049.0000+ 0.0000"

    "OTLWV+2201.0000+ 0.0000"

    "OTLWV+2202.0000+ 0.0000"

    "OTD/ROV+2401.0000+ 0.0000"

    "OTD/ROV+2402.0000+ 0.0000"

    "OTD/ROV+2403.0000+ 0.0000"

    "OTD/ROV+2404.0000+ 0.0000"

    ""OTD/ROV+2432.0000+ 0.0000"

    "OTD/ROV+2436.0000+ 0.0000"

    "OTD/ROV+2443.0000+ 0.0000"

    "OTD/ROV+2444.0000+ 0.0000"

    "OTD/ROV+2445.0000+ 0.0000"

    "OTD/ROV+2446.0000+ 0.0000"

    "G59WO+5324.0000+ 36.6190"

    "TLMLV+5601.0000+ 0.0000"

    "TLMLV+5602.0000+ 20.0000"

    "TLMLV+5603.0000+ 0.0000"

    "TLMLV+5605.0000+ 0.0000"

    "TLMLV+5606.0000+ 75.0000"

    "TLMLV+5607.0000+ 175.0000"','

    ')

    update #raw

    set rawdata = ltrim(rtrim(replace(rawdata, '"', '')))

    set statistics io on

    set statistics time on

    ;with CTE (ID, Row, Parsed) as

    (select id, row, parsed

    from #raw

    cross apply common.dbo.StringParserXML(rawdata, '+'))

    select id,

    (select parsed

    from CTE col1

    where row = 1

    and id = cte.id),

    (select parsed

    from CTE col2

    where row = 2

    and id = cte.id),

    (select parsed

    from CTE col2

    where row = 3

    and id = cte.id)

    from CTE

    order by id

    You'll need this for it to work:

    create database Common

    go

    use Common

    go

    create function [dbo].[StringParserXML]

    (@String_in varchar(max),

    @Delimiter_in char(10))

    returns @Parsed table (

    Row int,

    Parsed varchar(100))

    as

    -- This one is faster than Numbers table, but it doesn't correctly handle

    -- XML-specific characters, such as "<" or "&". Numbers table version will handle those

    -- without difficulty.

    begin

    if right(@string_in, 1) = @delimiter_in

    select @string_in = left(@string_in, len(@string_in) - 1)

    declare @XML xml

    select @xml = ' '

    insert into @parsed(row, parsed)

    select row_number() over (order by x.i.value('.', 'varchar(100)')), x.i.value('.', 'varchar(100)')

    from @xml.nodes('//i') x(i)

    return

    end

    - Gus "GSquared", RSVP, OODA, MAP, NMVP, FAQ, SAT, SQL, DNA, RNA, UOI, IOU, AM, PM, AD, BC, BCE, USA, UN, CF, ROFL, LOL, ETC
    Property of The Thread

    "Nobody knows the age of the human race, but everyone agrees it's old enough to know better." - Anon