A表:ID name type
1 cp01 T51,T52,T53
2 cp02 B33,B34,B35通过存储过程完成写入B表:ID name type
1 cp01 T51
2 cp01 T52
3 cp01 T53
4 cp02 B33
5 cp02 B34
6 cp02 B35
请大家帮忙?
1 cp01 T51,T52,T53
2 cp02 B33,B34,B35通过存储过程完成写入B表:ID name type
1 cp01 T51
2 cp01 T52
3 cp01 T53
4 cp02 B33
5 cp02 B34
6 cp02 B35
请大家帮忙?
SQL code
/*
标题:分拆列值
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-20
地点:广东深圳
描述有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
*/--1. 旧的解决方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #--2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)BDROP TABLE tb/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc(5 行受影响)
*/
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([ID] int,[name] varchar(4),[type] varchar(11))
insert [tb]
select 1,'cp01','T51,T52,T53' union all
select 2,'cp02','B33,B34,B35'
---查询---
select
a.id,
a.name,
type=SUBSTRING(A.type,B.number,CHARINDEX(',',a.type+',',B.number)-B.number)
from
tb a, master..spt_values b
where
b.type='P'
and
SUBSTRING(',' + A.type,B.number,1) = ','---结果---
id name type
----------- ---- -----------
1 cp01 T51
1 cp01 T52
1 cp01 T53
2 cp02 B33
2 cp02 B34
2 cp02 B35---插入b表---
insert into b
select
a.id,
a.name,
type=SUBSTRING(A.type,B.number,CHARINDEX(',',a.type+',',B.number)-B.number)
from
tb a, master..spt_values b
where
b.type='P'
and
SUBSTRING(',' + A.type,B.number,1) = ','