• Just some food for thought:

    declare @TestString varchar(8000) = '30;38469|31;38470|32;38471|33;38472|34;38473|35;38474|36;38475|37;38476|38;38477|';

    select

    max(case ds2.ItemNumber when 1 then ds2.Item else '' end) as field1,

    max(case ds2.ItemNumber when 2 then ds2.Item else '' end) as field2

    from

    dbo.DelimitedSplit8K(@TestString,'|') ds1

    cross apply dbo.DelimitedSplit8K(ds1.Item,';') ds2

    where

    ds1.Item <> ''

    group by

    ds1.ItemNumber;

    Uses Jeff's DelimitedSplit8K function as is.

    You will find the code for the dbo.DelimitedSplit8K function here: http://www.sqlservercentral.com/articles/Tally+Table/72993/.