sqlser2000 里有个task表,表结构和数据如下:
projectid id parentuid name depart
2000 5743 0 2000a 2000da
2000 5744 5743 2000b 2000db
2000 5745 5743 2000c 2000dc
2000 5746 5743 2000d 2000dd
2000 5747 5744 2000e 2000de
..........
有个sequence表,表结构如下:
a b
type 5747
..........我现在想导入这样的数据(数据在excel中):
projectid id parentuid name depart
2001 5743 0 2001a 2001da
2001 5744 5743 2001b 2001db
2001 5745 5743 2001c 2001dc
2001 5746 5743 2001d 2001dd
2001 5747 5744 2001e 2001de
其中id和parentuid(除过parentuid为0的除外)要依次取sequence表中type的值+1,插入的数据插入到数据库以后,应该是这个样子:
projectid id parentuid name depart
2001 5748 0 2001a 2001da
2001 5749 5748 2001b 2001db
2001 5750 5748 2001c 2001dc
2001 5751 5748 2001d 2001dd
2001 5752 5749 2001e 2001de
...........
当插入完成后,sequence表中type的值取id的最大值+1(这个主要是触发器就可以完成,主要是依次取sequence表中type的值+1这个如何实现?)
请教高手如何实现啊?
projectid id parentuid name depart
2000 5743 0 2000a 2000da
2000 5744 5743 2000b 2000db
2000 5745 5743 2000c 2000dc
2000 5746 5743 2000d 2000dd
2000 5747 5744 2000e 2000de
..........
有个sequence表,表结构如下:
a b
type 5747
..........我现在想导入这样的数据(数据在excel中):
projectid id parentuid name depart
2001 5743 0 2001a 2001da
2001 5744 5743 2001b 2001db
2001 5745 5743 2001c 2001dc
2001 5746 5743 2001d 2001dd
2001 5747 5744 2001e 2001de
其中id和parentuid(除过parentuid为0的除外)要依次取sequence表中type的值+1,插入的数据插入到数据库以后,应该是这个样子:
projectid id parentuid name depart
2001 5748 0 2001a 2001da
2001 5749 5748 2001b 2001db
2001 5750 5748 2001c 2001dc
2001 5751 5748 2001d 2001dd
2001 5752 5749 2001e 2001de
...........
当插入完成后,sequence表中type的值取id的最大值+1(这个主要是触发器就可以完成,主要是依次取sequence表中type的值+1这个如何实现?)
请教高手如何实现啊?
当parentuid=0的时候,不改变parentuid的值;
当parentuid不为0的时候,id取sequence表中type的值+1,而parentuid是id的值变了那么原先parentid的值肯定也要变成现在id的值。
其实这就是一棵树,不知道我说清楚没有?好紧张,o(∩_∩)o
工程 子件 父件
2001 name1 name0
2001 name2 name0
2001 name3 name1
2001 name4 name2
2001 name5 name2
导入到数据库的时候,依次取sequence表中type的值+1,变成:
projectid id parentuid name depart
2001 5748 0 name0 2001da
2001 5749 5748 name1 2001db
2001 5750 5748 name2 2001dc
2001 5751 5750 name3 2001dd
2001 5752 5750 name4 2001de
2001 5752 5749 name5 2001df
projectid id parentid name depart
2001 5748 0 2001a 2001da
2001 5749 5748 2001b 2001db
2001 5750 5748 2001c 2001dc
2001 5751 5748 2001d 2001dd
2001 5752 5749 2001e 2001de
取sequence表中type的值,id依次+1,将insert into #temp(原id,id),将parentid与#temp表中原id的值相对照,改成#temp表中id的值,这样有几万条数据导入的时候是不是效率特别低?
DECLARE @task TABLE(
projectid int,
id int,
parentuid int,
name varchar(50),
depart varchar(50)
)
INSERT INTO @TASK
SELECT 2000, 5743, 0, '2000a', '2000da' UNION ALL
SELECT 2000, 5744, 5743, '2000b', '2000db' UNION ALL
SELECT 2000, 5745, 5743, '2000c', '2000dc' UNION ALL
SELECT 2000, 5746, 5743, '2000d', '2000dd' UNION ALL
SELECT 2000, 5747, 5744, '2000e', '2000de'
DECLARE @sequence TABLE(
A VARCHAR(10),
B INT
)
insert into @sequence
select 'type',5747
DECLARE @MAX AS INT
SELECT @MAX=MAX(B)+1 FROM @SEQUENCE WHERE A='type'
SELECT projectid,ID,PARENTUID
,(select count(1)+@MAX from @TASK t2 where t2.id<t1.id) 'ID1'
,[NAME],DEPART
INTO #TEMP
FROM @TASK t1SELECT PROJECTID,ID1
, ISNULL((SELECT MAX(ID1) FROM #TEMP T2 WHERE T2.ID=T1.PARENTUID),0) 'PARENTUID'
,[NAME],DEPART
FROM #TEMP T1DROP TABLE #TEMP/*
2000 5748 0 2000a 2000da
2000 5749 5748 2000b 2000db
2000 5750 5748 2000c 2000dc
2000 5751 5748 2000d 2000dd
2000 5752 5749 2000e 2000de
*/