最简单的还是
truncate table A
insert A select * from temp
而且速度只会比你说的处理方法快。

解决方案 »

  1.   


        想问一下,是什么原因让你考虑需要增加一个过滤性质的表temp,而不是直接对A进行操作呢?
      

  2.   

    re3楼:temp是个临时表,考虑到A表很重要,在对A表更新之前要对temp进行一系列的逻辑检查,有错就立即放弃更新!
    re2楼:这样未免太武断了吧,不但硬盘受不了,记录有100万条,磁盘的操作肯定会比比较操作慢很多!!
      

  3.   

    temp是个临时表,考虑到A表很重要,在对A表更新之前要对temp进行一系列的逻辑检查,有错就立即放弃更新!--------------------------------------------------------------------------理由不充分。
      

  4.   

    再re2楼:因为对temp的修改每次不会很多,顶多100来条而已,所以不能直接用2楼的方法!另外我想到一种方法,就是给A增加一个bool标志字段ischanged,拷贝到temp之前先要把ischanged=false,然后对temp的操作过的记录都可以设置ischanged=true,最后再修改A,但是这样会不会不太好?
      

  5.   

    为什么不充分?A在正式更新之前,就是temp完全修改之前要进行一系列的验证,任何发现的错误都将使temp作废,然后再从A拷贝,再修改,直到正确!!没有temp万万不行的!
    拷贝temp是很费时间,但是安全第一,否则我不就直接再A中修改了?
      

  6.   

    给你个最快的不读硬盘的,一个思路。
    drop table dbo.[A] exec sp_rename 'dbo.temp','[A]'
    就很快
    不过要测试你的脚本和存储过程依赖关系。
      

  7.   

    不好意思,可能我为了简化问题没有把实际情况完整地说出来,而使大家想的方法有偏差,其实temp中不光有A的数据,它还包括另外若干各的数据表中的数据,上面所谓地检查就是检验各个数据之间的联系,不能有错,反正不能把A表删了再把temp命名为A表。
    而且实际上当temp修改检验完毕并更新A后,它还将接着进行下一步的修改和更新(如果A的字段不改的话),否则还得重新生成一个temp!不知这下说清楚没有,唉!!
      

  8.   

    有点明白了。
    你可以枚举所以动态字段,把所以字段值连接起来用函数CHECKSUM(或CHECKSUM_AGG) 生成一个哈希索引字段,按主键ID比较哈希索引就可以知道每条记录是不是更新,修改了。每个表的动态字段用信息视图INFORMATION_SCHEMA.COLUMNS得到。我也不知道明白没有
      

  9.   

    你那temp表中应该增加两个字段,一个是标识数据来自哪个表(你不是说它的数据来自多个表的吗),另一个是标识数据是否进行了修改
    代码如下:
    begin tran
    delete from a where (条件是temp中属于a表但已经修改的记录)
    insert into a
    select (temp表中所有属于a表的字段) from temp where temp.主码 not in (select 主码 from a) and temp表中属于a表的记录
    commit