用存储过程实现,需求如下: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 =1)
   少于1次,Mark=1,否则Mark=0组合数据后,插入D表新记录,并且其中发生一次错误,就会滚到原始未处理状态
 
请各位帮帮忙,新手一个,估计A表和D表中每月的纪录有6万条,最大保存1-2年,可能也就20W-40W条,所以应考虑效率?

解决方案 »

  1.   

    更正一下:
    1) 一年保存100W条左右数据,不是20W-40W
    2) 在D表本身查本季度已打印过的有效次数(PrintTag=1 =1)
       少于1次,Mark=1,否则Mark=0, 就是根据Account和以上PrintTag、字段来查
       比如3月份,前1、2月打过一次,这一次插入的Mark就为0了
      

  2.   


    --使用事务即可,如下:--当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。
    set xact_abort on 
    begin tran
    --你的游标代码
    commit tran
      

  3.   

    对,去联机帮助查下事务的用法,其实很简单的,用@@ROWCOUNT和@@ERROR来判断,把它们赋给2个临时变量保存,如果出错,就回滚,没有则执行,就OK了
      

  4.   

    給出測試數據,並適當對4個table的欄位加以說明,看不懂了
      

  5.   

    A表 Account,ACC_Type,IsMustCheck,Cash,Year,Month   主键:Account-Year-Month0000000000001 'B' 'Y' 10000000.00  2007 4
    0000000000002 'S' 'M' 1000.00      2007 4
    0000000000003 'B' 'M' 1000000.00   2007 4
    0000000000004 'M' 'M' 100000.00    2007 4
        
    B表 Account,Dept,DeptName    主键:Account
    0000000000001  111  支行网点A
    0000000000002  111  支行网点B
    0000000000003  111  支行网点C
    0000000000004  111  支行网点A
       
    D表 Account,ACC_Type,IsMustCheck,Cash,Year,Month,Dept,DeptName,BillState,Mark   主键:Account-Year-Month,BillState默认0,Mark默认0
    Account     ACC_Type,IsMustCheck,  Cash,  Year,Month,Dept,DeptName,BillState,Mark   
    0000000000001 'B'        'Y'   10000000.00  2007  4   111  支行网点A   1       0现在要根据A表记录将当月记录全部要在D表中有,(Dept,DeptName根据B表关联)中,Account,ACC_Type,IsMustCheck,Cash,Year,Month,Dept,DeptName都有了
    每次插入只根据月份来,只操作1月数据循环A表中当月纪录,对每账号,D表中当月有的记录,更新Cash列数据,保留BillState列值,否则就插入
    而值的确定,依赖于D表中本季度是否存在记录,如现在为4月,查询是否存在同一账号,3月份的纪录,有就为0,没有就为1,插入
      

  6.   

    再顶顶
    现在正常操作如下:
    查询A表,有以下几个操作
    1)看D表中是否有相同数据
    2)有修改,没有插入
    3)查询D表同季度有没有数据
    4)有就改写数据Update如果A表有效数据6W条记录(创建A表临时表只存当月要插的数据,不从原始A表查)
    估计要20W次操作,并且某些操作很耗费时间,效率上不去阿