删除后直接插入,不用更新.
delete from 表B where 主键A in (select 1 from 表A where 传输标志=1)
insert into 表B select * from 表A where 传输标志=1

解决方案 »

  1.   

    最后还有一句设置传输标志:
    update 表A set 传输标志=0
      

  2.   

    不要使用UPDATE,如果存在就删除,再把所有记录再插入就可以了.
      

  3.   

    用存储过程:begin transupdate b
    set col1=a.col1,col2=a.col2,...
    from a,b
    where a.主键A=b.主键A
    and a.传输标志=1
    if @@error<>0
    begin
        rollback trans
        return
    endinsert b(...)
    select ... from a 
    where 传输标志=1
    and not exists (
    select * from b 
    where 主键A=a.主键A
    )
    if @@error<>0
    begin
        rollback trans
        return
    endupdate a 
    set 传输标志=0
    where 传输标志=1
    if @@error<>0
    begin
        rollback trans
        return
    end
    commit trans哈,哈哈,哈哈哈......
      

  4.   

    关于zjcxc(邹建) 的说法我有以下看法:
    先删后添是一个办法,但我认为这们会给数据库添加很大的负担!
    例如我要更新10万条数据,那么就要先delete10条数据,再insert10万条数据?
    这样做并不太好吧?
    另我想知道您是从那一本书上看到过的?
      

  5.   

    关于 Hahahahahaha(哈,哈哈,哈哈哈...) 的看法的回复:
    因为我想把这个小程序做成通用的
    也就是说表1与表2可以是任意选择!那么用存储过程不太实际!
      

  6.   

    通用?改成动态sql哈,哈哈,哈哈哈......
      

  7.   

    create proc 过程名
    @原表名 varchar(1000),
    @目标表名 varchar(1000),
    @主键列名 varchar(1000)
    as
    exec('insert '+@目标表名+' select * from '+@原表名+' where '+@主键列名+'not in (select '+@主键列名+' from '+@目标表名+')')
      

  8.   

    insert into .... select 
    select * into from
      

  9.   

    Hahahahahaha(哈,哈哈,哈哈哈...) 怎样写动态的sql?能举例么?
    因为我想把小程序做成两个表之间的数据传输。
    表与字段都是可选择的!
      

  10.   

    大力写的那个选择的列是*。
    因为考虑到有可能表A与表B的字段名、类型都是可选的
    也就是说
    表A.x->表B.y
    x与y的名字与类型有可能不一样哟!还有在表中所处的位置也不一样哟!