转移数据的存储过程

费了好几个小时才 搞定呀,从中可以看到很多技术.

set  ANSI_NULLS  ON
set  QUOTED_IDENTIFIER  ON
go

--  =============================================
--
 Author:        <Author,,Neil>
--
 Create date: <Create Date,,20070514>
--
 Description:    <Description,,MOVE DATA TO from a table to another table according to datetime>
--
 =============================================
--
test begin
execute  sp_Move_Data 
    
' 2007-05-13 ' ,
    
' 2007-05-14 ' ,
    
' table1 ' ,
    
' table2 '
print   @@rowcount
declare   @exeCount   int
declare   @temp    int
set   @exeCount   =   3
set   @temp   =   0
begin   tran
select   top  ( @exeCount *   from  tableName         -- 这里是2005的新特性:top中可以加入变量,但是要加"()"的.
--
@temp = @@rowcount
if   @@rowcount   =   @exeCount
    
set   @temp   =   @exeCount
commit   tran
if   @temp   =   @exeCount
    
print   @temp

-- test end

ALTER   PROCEDURE   [ dbo ] . [ sp_Move_Data ]  
    
@beginDate   nvarchar ( 20 ),
    
@endDate   nvarchar ( 20 ),
    
@originTableName   nvarchar ( 50 ),         -- 要移出数据的表
         @destinationTableName   nvarchar ( 50 )       -- 要移入数据的表
AS
    
BEGIN
        
DECLARE   @tmpRowCount   int   -- 临时存储相应行数
         DECLARE   @exeCount   varchar ( 9 -- 每次循环处理的语句条数 
         SET   @exeCount   =   ' 3000 '
        
BEGIN   TRANSACTION
            
EXECUTE  ( ' INSERT INTO [ '   +   @destinationTableName   +   ' ] SELECT TOP  '   +   @exeCount   +  
                
'  * FROM [ '   +   @originTableName   +  
                
' ] WHERE logTime between  '''   +   @beginDate   +   '''  and  '''   +   @endDate   +   '''' )
            
SET   @tmpRowCount   =   @@ROWCOUNT
            
IF   @@ERROR   >   0  
            
BEGIN
              
GOTO  TranRollBack      -- 这里直接用RollBack语句就会有error tran begin的错误,我也不知道为什么

,书上都是用的标签,我也用吧.不过我想写过程式的人都会很讨厌GOTO吧.
            
END
            
print   @tmpRowCount      -- 我真的不知道存储过程用什么Debug,只有用print语句了
             EXECUTE  ( ' DELETE TOP ( '   +   @exeCount   +   
                
' ) FROM [ '   +   @originTableName   +  
                
' ] WHERE logTime between  '''   +   @beginDate   +   '''  and  '''   +   @endDate   +   '''' )
--             print @@ROWCOUNT    --这里会print 3000
--
            print  @tmpRowCount
--
            print @@ROWCOUNT    --但是这里会print 0 ,@@ROWCOUNT对PRINT语句也起作用.
             PRINT  ( ' DELETE TOP ( '   +   @exeCount   +   
                
' ) FROM [ '   +   @originTableName   +  
                
' ] WHERE logTime between  '''   +   @beginDate   +   '''  and  '''   +   @endDate   +   '''' )
            
IF   @@ERROR   >   0   OR   @tmpRowCount   <>   @@ROWCOUNT      -- 错误OR插入删除操作相应行数不同
             BEGIN  
                TranRollBack:
                
print   ' ROLLBACK '
                
ROLLBACK   TRAN
            
END
            
ELSE  
            
BEGIN
                
print   @tmpRowCount
                
COMMIT   TRANSACTION
            
END
        
-- TRANSACTION OVER
         print   @tmpRowCount
        
WHILE   @tmpRowCount   =   @exeCount
        
BEGIN
            
BEGIN   TRANSACTION
            
EXECUTE  ( ' INSERT INTO [ '   +   @destinationTableName   +   ' ] SELECT TOP  '   +   @exeCount   +  
                
'  * FROM [ '   +   @originTableName   +  
                
' ] WHERE logTime between  '''   +   @beginDate   +   '''  and  '''   +   @endDate   +   '''' )
            
IF   @@ERROR   >   0  
                
GOTO  TranRollBack2 
            
SET   @tmpRowCount   =   @@ROWCOUNT
            
print  ( ' INSERT INTO [ '   +   @destinationTableName   +   ' ] SELECT TOP  '   +   @exeCount   +  
                
'  * FROM [ '   +   @originTableName   +  
                
' ] WHERE logTime between  '''   +   @beginDate   +   '''  and  '''   +   @endDate   +   '''' )
            
EXECUTE  ( ' DELETE TOP ( '   +   @exeCount   +   
                
' ) FROM [ '   +   @originTableName   +  
                
' ] WHERE logTime between  '''   +   @beginDate   +   '''  and  '''   +   @endDate   +   '''' )
            
IF   @@ERROR   >   0   OR   @tmpRowCount   <>   @@ROWCOUNT      -- 错误OR插入删除操作相应行数不同
             BEGIN  
                TranRollBack2:
                
ROLLBACK   TRAN
            
END
            
ELSE  
                
COMMIT   TRANSACTION
        
-- TRANSACTION OVER
         END
    
END

-- 其实也可以用事务的嵌套的,只是那个技术我还没有掌握,以后学会了再加上吧.
请各位多提宝贵意见,大家多交流呀.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值