樹形資料轉換

2021-04-14 11:30:25 字數 3840 閱讀 1279

--測試資料

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--刪除測試

樹形資料轉換

測試資料 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...