存储过程:通过字符串中的分界符,把一列分为多列!

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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,,
*/
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值