本文共 2658 字,大约阅读时间需要 8 分钟。
原帖地址:
--测试数据create table PROJECT(id int,name nvarchar(20),parent_id int)insert PROJECT select 1,'所有项目',nullunion all select 2,'项目1',1union all select 3,'项目2',1create table task(id int,name nvarchar(20),outline varchar(10))
insert task select 1 ,'任务1' ,'1'union all select 2 ,'任务1.1' ,'1.1'union all select 3 ,'任务1.1.1' ,'1.1.1'union all select 4 ,'任务1.1.2' ,'1.1.2'union all select 5 ,'任务2' ,'2'union all select 6 ,'任务2.1' ,'2.1'union all select 7 ,'任务2.1.1' ,'2.1.1'union all select 8 ,'任务2.1.1.1','2.1.1.1'union all select 9 ,'任务3' ,'3'union all select 10,'任务4' ,'4'union all select 11,'任务4.1' ,'4.1'go/*--处理要求 1.把一数据库的TASK表的数据导入到另一数据库的PROJECT表与TEMP1表.导进去的数据上下级关系不再是用大纲显示,而是通过parent_id和project_id表示上下级。 2.表TEMP1的project_id与project表中的id关联,表project表中的parent_id是对该表本身id字段的关连。 3.要把task表的最底层的任务(没有子任务的)导入到temp1表,他的上级任务通过project_id关连 4.从TASK表导入数据的parent_id自己输入--*/
/*--最后实现的结果:
--** PROJECT 表的内容id name parent_id ----------- -------------------- ----------- 1 所有项目 NULL2 项目1 13 项目2 14 任务1 25 任务1.1 46 任务2 27 任务2.1 68 任务2.1.1 79 任务4 2
(所影响的行数为 9 行)
--temp1 表的内容id name project_id ----------- -------------------- ----------- 1 任务1.1.1 52 任务1.1.2 53 任务2.1.1.1 84 任务3 25 任务4.1 9
(所影响的行数为 5 行)--*/
--处理的存储过程
create proc p_process@parent_id int=2asset nocount ondeclare @id int,@step int,@s nvarchar(1000)--得到 PROJECT 表中的新编号(因为不知道PROJECT的id是否标识字段,所以用了一些判断)
select @step=ident_incr('PROJECT'),@id=ident_current('PROJECT')+@stepif @id is nullselect @id=isnull(max(id),0)+1 from PROJECTselect @s='alter table #t add id int identity('+rtrim(@id)+','+rtrim(isnull(@step,1))+')'--生成处理临时表
select name,parent_id=@parent_id,outline into #t from task awhere exists(select * from task where outline like a.outline+'.%')order by outline--生成id,并且生成 praent_id
exec(@s)update a set parent_id=b.idfrom #t a,#t bwhere charindex('.',a.outline)>0and a.outline like b.outline+'.%'and charindex('.',a.outline,len(b.outline)+2)=0--处理结果插入 PROJECT
if @step is not nullset identity_insert PROJECT oninsert PROJECT(id,name,parent_id) select id,name,parent_id from #t--生成表temp1
if exists(select * from sysobjects where name='temp1' and objectproperty(id,'isusertable')=1)drop table temp1select id=identity(int),a.name,isnull(b.id,@parent_id) as project_idinto temp1 from task a left join #t b on a.outline like b.outline+'.%'and charindex('.',a.outline,len(b.outline)+2)=0where not exists(select * from #t where outline=a.outline)go--调用
exec p_process 2--显示处理后的结果
select * from PROJECTselect * from temp1go--删除测试
drop table PROJECT,task,temp1drop proc p_processTrackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=225430