我把计算得到的数据放到表A中(大量数据),然后把A的数据插入到数据库表B中,A为在程序定义的表,与表B结构相同,且存在两列做为主键,如果B表中存在记录就不插入(或更新也可)。一条条插入太费时间(数据量大),加上是网络传输,不怎么可取。能用存储过程实现吗?能传递一个表过去吗?然后后台处理?或别的好办法????

解决方案 »

  1.   

    UPDATE B
    SET B.value_col1=A.value_col1
    ,B.value_col2=A.value_col2
    ...
    FROM A, B
    WHERE B.key_col1=A.key_col1
    AND B.key_col2=A.key_col2--插入不存在的
    INSERT INTO B
    (col1, col2, col3, ... )
    SELECT col1, col2, col3, ... 
    FROM A
    WHERE NOT EXISTS 
    (SELECT 1
    FROM B
    WHERE B.key_col1=A.key_col1
    AND B.key_col2=A.key_col2)
      

  2.   

    --更新已经存在的
    UPDATE B
    SET B.value_col1=A.value_col1
    ,B.value_col2=A.value_col2
    ...
    FROM A, B
    WHERE B.key_col1=A.key_col1
    AND B.key_col2=A.key_col2--插入不存在的
    INSERT INTO B
    (col1, col2, col3, ... )
    SELECT col1, col2, col3, ... 
    FROM A
    WHERE NOT EXISTS 
    (SELECT 1
    FROM B
    WHERE B.key_col1=A.key_col1
    AND B.key_col2=A.key_col2)
      

  3.   

    楼主
    是不是要这样
    insert a(id,num)--计算列插入A表
    select id, sum(num) from tupdate b有就更新
    set num=a.num
    from a where b.id=a.idinsert b--没有就插入
    select * from a where not exists(select 1 from b where id=a.id)
      

  4.   

    select a.id id1,b.id id2 into #t from a left join b on a.id = b.idinsert into b(列)
    select 列 from a inner join #t c on a.id = c.id1 where c.id2 is nullupdate b
    set **********************
    from a,#t c
    where a.id = c.id1 and c.id2 is not null
      

  5.   

    使用insert into select from  where 将不匹配的数据排除在插入
      

  6.   

    可以使用SQL2005中的Integration Services来做
      

  7.   

    加上是网络传输
    ------------------------------------------------------------------------
    如果A、B两个表分别在不同的服务器上,使用链接服务器方式来做。如之前诸位所描述,只需要不超过两条SQL语句就可以解决这个问题。
      

  8.   

    分在两地的话,最好先把A表传到B表所在的服务器上再做。根据你的需求,应该只是做insert就够了
    ---将A copy到本地
    select into #A from [....].Ainsert B(col1,col2...)
    select A.col1,A.col2...
    from #A A left join B on A.id = B.id
    where B.id is null对于大数据量的更新操作,如果要用事务记得一定要先做Update再做Insert,因为如果Update出错了,回滚的时间会相当的长。如果超大数据量的更新,就不得不考虑到表上索引对更新效率的影响了,如果是每天做批量,不影响业务的话,可以将rename B表,然后B表和#A表做Union插入另一张C表,在C表上重建索引后rename为A表。
      

  9.   

    更正:
    在C表上重建索引后rename为B表
      

  10.   

    链接服务器+INSET into B
    SELECT * FROM LinkServer.dbo.A where NOT EXISTS (SELECT 1 FROM B WHERE 主键=A.主键 )