[sql server ]insert into A表 select --from B表 的问题

yuna@liu 2010-01-29 03:35:41
现在想写一个存储过程:

A,B 表数据结构大致相同
实现
将B表中满足某些条件的 记录,先写入A表,并且,将这些记录从B表中删除

insert into tab_a select ---from tab_b where 条件 (1)
delete from tab_a where 条件 (2)

问题:
如果在进行写入操作时,某条记录写入A表 出现问题,整个执行就会中断。这时候已有部分数据写入A表,但尚未执行从B表删除的操作。
为了避免,出现部分记录写入A表,但没有从B表中删除的情况,可以在存储过程中,放个回滚
可是这样有些浪费资源,因为A,B表 是大数据表,每次执行存储过程操作大量数据。如果因为一,两条记录出现问题,就要放弃操作,并回滚之前所有操作,很冤枉---请问:有没有其他办法呢----
...全文
482 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuhaiwuya 2010-02-03
  • 打赏
  • 举报
回复
呵呵 刚才没看清楚,不想加事物的话,那就像刚才说那样,增加一个临时表。然后判断临时表插入的记录与你select B的条数是否一致,不一致的话 认为,需要将B剩下的数据。重新插入临时表,循环判断
wuhaiwuya 2010-02-03
  • 打赏
  • 举报
回复
在存储过程里加上事物处理
  • 打赏
  • 举报
回复
你也可以用临时表记录下你插入的数据,在出错时进行处理
ddy_dhj 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wuhaiwuya 的回复:]
在存储过程里加上事物处理
[/Quote]


正解,事物在其中一个未成功的情况下,全部回滚最初的状态...应该是你要的...
wingfeng_2006 2010-02-02
  • 打赏
  • 举报
回复
把数据从A导出,再把数据导入到B
ReachZh 2010-02-01
  • 打赏
  • 举报
回复
做个备份,把表重新创建。呵呵
yuna@liu 2010-02-01
  • 打赏
  • 举报
回复
分批处理 也是一个办法,还有更好的办法吗

上面说:
存储过程的指针??
我是打算在数据库建一个计划任务,来执行存储过程的
所以,操作要在一个存储过程内完成

asp读记录集一样,是一条一条的操作”当然是最好的办法了。

seesea125 的方法,是怎么实现的 可以给给示范
seesea125 2010-01-29
  • 打赏
  • 举报
回复
你可以用存储过程的指针啊
这样就像asp读记录集一样,是一条一条的操作,插入A表一条记录,然后删除
如果某条插入有错误,就把这一条回滚,然后程序继续循环啊,并把错误ID写到一个日志表中去,方便以后好查哪些没成功
xray2005 2010-01-29
  • 打赏
  • 举报
回复
这样试试行不行。就是分批处理。每次处理1000或者1W条。提交处理完毕后,再又处理1000或者1W。。。直到所有的提交处理完毕。

这样话的,出错了不至于让你全部重新处理。
yuna@liu 2010-01-29
  • 打赏
  • 举报
回复
我习惯不用触发器 ,触发器容易出问题吧
_老吴 2010-01-29
  • 打赏
  • 举报
回复
用触发器试试

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧