--測試資料
create table project(id int,name nvarchar(20),parent_id int)
insert project select 1,'所有專案',null
union all select 2,'專案1',1
union all select 3,'專案2',1
create 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 所有專案 null
2 專案1 1
3 專案2 1
4 任務1 2
5 任務1.1 4
6 任務2 2
7 任務2.1 6
8 任務2.1.1 7
9 任務4 2
(所影響的行數為 9 行)
--temp1 表的內容
id name project_id
----------- -------------------- -----------
1 任務1.1.1 5
2 任務1.1.2 5
3 任務2.1.1.1 8
4 任務3 2
5 任務4.1 9
(所影響的行數為 5 行)
--*/
--處理的儲存過程
create proc p_process
@parent_id int=2
asset nocount on
declare @id int,@step int,@s nvarchar(1000)
--得到 project 表中的新編號(因為不知道project的id是否標識字段,所以用了一些判斷)
select @step=ident_incr('project')
,@id=ident_current('project')+@step
if @id is null
select @id=isnull(max(id),0)+1 from project
select @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 a
where exists(
select * from task where outline like a.outline+'.%')
order by outline
--生成id,並且生成 praent_id
exec(@s)
update a set parent_id=b.id
from #t a,#t b
where charindex('.',a.outline)>0
and a.outline like b.outline+'.%'
and charindex('.',a.outline,len(b.outline)+2)=0
--處理結果插入 project
if @step is not null
set identity_insert project on
insert 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 temp1
select id=identity(int),a.name,isnull(b.id,@parent_id) as project_id
into temp1 from task a left join
#t b on a.outline like b.outline+'.%'
and charindex('.',a.outline,len(b.outline)+2)=0
where not exists(
select * from #t where outline=a.outline)
go--呼叫
exec p_process 2
--顯示處理後的結果
select * from project
select * from temp1
go--刪除測試
drop table project,task,temp1
drop proc p_process
樹形資料轉換
測試資料 create table project id int,name nvarchar 20 parent id int insert project select 1,所有專案 null union all select 2,專案1 1 union all select 3,專案2 1 cr...
樹形資料轉換
測試資料 create table project id int,name nvarchar 20 parent id int insert project select 1,所有專案 null union all select 2,專案1 1 union all select 3,專案2 1 cr...
樹形資料轉換
測試資料 create table project id int,name nvarchar 20 parent id int insert project select 1,所有專案 null union all select 2,專案1 1 union all select 3,專案2 1 cr...