CREATE PROCEDURE p_creatpwd 
         @startnum bigint,--开始位置
         @creatnum bigint,--生成数量
         @bitnum int, --生成位数
         @msg varchar(50)  output  --输出信息
as
declare @i bigint
declare @maxi bigint
declare @sum bigint -- 记录插入的个数
set @i = @startnum
set @maxi = @i + @creatnum
set @sum=0BEGIN TRAN T1while @i<@maxi
begin
set @i = @i + 1
insert into TMP_PwdCode_tab(PWDCode,OrderRand,bitnum)values(cast(@i as varchar(50)),cast(ceiling(rand()*10000)as int),@bitnum)
   IF (@@ERROR <>0 )
begin
set @sum = 0   --如果有错误将计数器清为零
 break               --如果有错误就退出当前循环
             end 
    set @sum= @sum+1
end
Update MapingNum_tab set StarNum= StarNum+ @sum ,freenum=freenum+@sum where bitnum=@bitnum
IF (@@ERROR =0 )
COMMIT TRAN T1
else
ROLLBACK  TRAN T1set  @msg = @sum
GO

解决方案 »

  1.   

     break               --如果有错误就退出当前循环 ---这儿要rollback呀
      

  2.   

    CREATE PROCEDURE p_creatpwd 
    @startnum bigint,--开始位置
    @creatnum bigint,--生成数量
    @bitnum int, --生成位数
    @msg varchar(50) output --输出信息
    as
    declare @i bigint
    declare @maxi bigint
    declare @sum bigint -- 记录插入的个数
    set @i = @startnum
    set @maxi = @i + @creatnum
    set @sum=0BEGIN TRAN T1while @i <@maxi
    begin
    set @i = @i + 1
    insert into TMP_PwdCode_tab(PWDCode,OrderRand,bitnum)values(cast(@i as varchar(50)),cast(ceiling(rand()*10000)as int),@bitnum)
    IF (@@ERROR <>0 )
    begin
    rollback tran
    return
    end 
    set @sum= @sum+1
    end
    Update MapingNum_tab set StarNum= StarNum+ @sum ,freenum=freenum+@sum where bitnum=@bitnum
    IF (@@ERROR =0 )
    COMMIT TRAN T1
    else
    ROLLBACK TRAN T1set @msg = @sum
    GO