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这个如何实现?)
请教高手如何实现啊?

解决方案 »

  1.   

    用openrowset导入到数据库后,再通过SQL语句修改.
      

  2.   

    excel表导入到sqlserver我会,关键是请教如何用sql语句依次取sequence表中type的值+1?
      

  3.   

    说实话没看懂parentuid  的规则
      

  4.   

    parentuid  的规则是这样的:
    当parentuid=0的时候,不改变parentuid的值;
    当parentuid不为0的时候,id取sequence表中type的值+1,而parentuid是id的值变了那么原先parentid的值肯定也要变成现在id的值。
    其实这就是一棵树,不知道我说清楚没有?好紧张,o(∩_∩)o
      

  5.   

    或者这么说,如果是这样的数据:
     工程     子件   父件
     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 
      

  6.   

    想到一个简单的说法:
    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的值,这样有几万条数据导入的时候是不是效率特别低?
      

  7.   


    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
    */