日期:2014-05-18  浏览次数:20537 次

游标怎么实现循环多表查询并插入,要求出错就全部回滚到初始状态
用存储过程实现,需求如下:

A表   Account,ACC_Type,IsMustCheck,Cash,Year,Month      
        (主键:Account-Year-Month)
B表   Account,Dept,DeptName        
        (主键:Account)      
C表   Account,BillState,Year,Month
        (主键:Account-Year-Month)

D表   Account,ACC_Type,IsMustCheck,Cash,Year,Month,PrintTag
        Dept,DeptName,Mark
        (主键:Account-Year-Month,PrintTag默认0,Mark默认0

现在要求将A表所有数据都导入到D表相关列中,
1)差额列固定的如Dept,DeptName从B表中取得
2)动态列BillState必须从C表中查相应的数据(Account-Year-Month),没有就写默认或不写
3)在D表本身查本季度已打印过的有效次数(PrintTag=1   mark=1)
      少于1次,Mark=1,否则Mark=0

组合数据后,插入D表新记录,并且其中发生一次错误,就会滚到原始未处理状态
 
请各位帮帮忙,新手一个,估计A表和D表中每月的纪录有6万条,最大保存1-2年,可能也就20W-40W条,所以应考虑效率?

------解决方案--------------------

--使用事务即可,如下:

--当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。
set xact_abort on


begin tran


--你的游标代码


commit tran

------解决方案--------------------
对,去联机帮助查下事务的用法,其实很简单的,用@@ROWCOUNT和@@ERROR来判断,把它们赋给2个临时变量保存,如果出错,就回滚,没有则执行,就OK了
------解决方案--------------------
100萬紀錄,用游標可能會比較慢喔

------解决方案--------------------
給出測試數據,並適當對4個table的欄位加以說明,看不懂了
------解决方案--------------------
如果有那么大的数据量,速度是很大的问题啊!