create
table
tb (cno
varchar
(
10
),msg
varchar
(
200
))
insert into tb
select ' 0001 ' , ' YK|43.00|43.00| ' union all
select ' 0002 ' , ' ZX|2350.00|2350.00| ' union all
select ' 0003 ' , ' 2032|MD|15|120.00|120.00|4518105496132709,12/2006,0,,| '
declare @max int , @i int
declare @sql varchar ( 8000 )
select @max = len (msg) - len ( replace (msg, ' | ' , '' )), @i = 1 , @sql = '' from tb
select cno,msg + replicate ( ' | ' , @max - len (msg) + len ( replace (msg, ' | ' , '' ))) as msg into tbx from tb
while @i <= @max
begin
select @sql = @sql + ' ,col ' + ltrim ( @i ) + ' varchar(30) ' , @i = @i + 1
end
set @sql = ' create table tbxx(cno varchar(10) ' + @sql + ' ) '
exec ( @sql )
insert into tbxx(cno)
select cno from tbx
set @i = 1
while @i <= @max
begin
select @sql = ' declare @tmp table(cno varchar(10),head varchar(30))
insert into @tmp(cno,head)
select cno,left(msg,charindex( '' | '' ,msg)-1) from tbx
update tbx set msg=stuff(msg,1,charindex( '' | '' ,msg), '''' )
update a set a.col ' + ltrim ( @i ) + ' =b.head from tbxx a,@tmp b where a.cno=b.cno '
exec ( @sql )
set @i = @i + 1
end
select * from tbxx
drop table tb,tbx,tbxx
-- result
/*
cno col1 col2 col3 col4 col5 col6
-------- ------ ------ -------- ---------- ----------- --------------------------------
0001 YK 43.00 43.00
0002 ZX 2350.00 2350.00
0003 2032 MD 15 120.00 120.00 4518105496132709,12/2006,0,,
*/
insert into tb
select ' 0001 ' , ' YK|43.00|43.00| ' union all
select ' 0002 ' , ' ZX|2350.00|2350.00| ' union all
select ' 0003 ' , ' 2032|MD|15|120.00|120.00|4518105496132709,12/2006,0,,| '
declare @max int , @i int
declare @sql varchar ( 8000 )
select @max = len (msg) - len ( replace (msg, ' | ' , '' )), @i = 1 , @sql = '' from tb
select cno,msg + replicate ( ' | ' , @max - len (msg) + len ( replace (msg, ' | ' , '' ))) as msg into tbx from tb
while @i <= @max
begin
select @sql = @sql + ' ,col ' + ltrim ( @i ) + ' varchar(30) ' , @i = @i + 1
end
set @sql = ' create table tbxx(cno varchar(10) ' + @sql + ' ) '
exec ( @sql )
insert into tbxx(cno)
select cno from tbx
set @i = 1
while @i <= @max
begin
select @sql = ' declare @tmp table(cno varchar(10),head varchar(30))
insert into @tmp(cno,head)
select cno,left(msg,charindex( '' | '' ,msg)-1) from tbx
update tbx set msg=stuff(msg,1,charindex( '' | '' ,msg), '''' )
update a set a.col ' + ltrim ( @i ) + ' =b.head from tbxx a,@tmp b where a.cno=b.cno '
exec ( @sql )
set @i = @i + 1
end
select * from tbxx
drop table tb,tbx,tbxx
-- result
/*
cno col1 col2 col3 col4 col5 col6
-------- ------ ------ -------- ---------- ----------- --------------------------------
0001 YK 43.00 43.00
0002 ZX 2350.00 2350.00
0003 2032 MD 15 120.00 120.00 4518105496132709,12/2006,0,,
*/