日期:2014-05-19  浏览次数:20750 次

高分求个update的解决方案
我这里有两个表:

我有个线程要把表B中字段c为0的数据添加到表A中,然后把表B的字段c更新为1
这个是我添加用的sql语句insert into A(A,B) select top 100 a,b from B where c=0
然后更新的时候我怎么更新啊,怎样才能只更新这一批添加到A表中的B表记录的c字段?
有人说直接update B set c=1,但是这样做的话,我在执行insert操作时,B表来了新数据会把这些还没有添加A表的新数据同时更新掉,会造成A表的数据不全。
请各位帮帮忙,给个解决方法,怎样才能完美的将B表的数据添加到A表。既不能重复又不能缺失数据能?
PS:我之前是先查询一批c=0的数据添加到A表,然后更新B的c为1,分为了3步,数据是能够全部不重复添加A表,但是客户反映效率慢,所以这种方法就不要说了。
先在这里谢谢了
------解决方案--------------------
起事物啊,在事务中对表的操作都是同样的,也就是你可以把你的操作放在一个事物里面,这样就不会出现你说的那种问题了。
------解决方案--------------------
insert into A(A,B) select  a,b from B where c=0
update B set c=1 where c = 0
把上面两个作为一个事务提交
不会产生这种情况的:在执行insert操作时,B表来了新数据会把这些还没有添加A表的新数据同时更新掉,会造成A表的数据不全,因为是先将数据拷贝到A表的。
------解决方案--------------------

begin tran

-- 建立临时表
create table #tmp(id int,A varchar(255),B varchar(255))
-- 插入临时表
insert into #tmp select top 1000 A,B from 表B where C=0
if @@error<>0
begin 
  rollback tran 
  return 
end 

-- 更改已插入数据标记
update 表B set 表B.C = 1 from #tmp where 表B.id = #tmp.id
if @@error<>0
begin 
  rollback tran 
  return 
end 

-- 可以对临时数据进一步处理

-- 转移数据
insert into 表A(A,B) select A,B from #tmp
drop table #tmp

commit tran

手打的 没测试
自己纠一下错
------解决方案--------------------
[quote=引用:]
正解
------解决方案--------------------
insert into A(A,B,C) select top 100 a,b,1 from B where c=0