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,,
*/
本文通过一个具体的SQL脚本实例,展示了如何将带有竖线分隔符的字符串字段拆分为多个列的过程。该过程涉及创建临时表、使用循环结构逐个解析字符串字段,并最终形成一个规范化的表结构。

被折叠的 条评论
为什么被折叠?



