我写了一个生成指定数量记录的存储过程,有一个字段的值有唯一性约束,而且这个值是随机生成的,在插入的时后如果报错,就返回重新生成一个值,再插入,但程序在报错后,就终止执行了,生成的数量少于指定的数量,能否忽略这个错误,继续执行?
存储过程的部分代码如下WHILE(@m < @Quantity)
    BEGIN
     GetCodeNo:
     DECLARE @RandNo INT,@SingleNo CHAR(1),@CodeNo VARCHAR(30),@i INT
     SELECT @i = 0,@CodeNo = ''
     WHILE(@i < @NumberLength)
     BEGIN
     SET @RandNo = CAST(RAND()*35 AS INT)
     IF (@RandNo > 0 AND @RandNo <= 9)
     SET @SingleNo = CHAR(@RandNo + 48)
     ELSE
     SET @SingleNo = CHAR(@RandNo + 55)
     SET @VouchersNo = @VouchersNo + @SingleNo
     SET @i = @i + 1
     END
     --增加记录到抵用券表
     INSERT INTO CodeInfo(CodeNo) VALUES(@CodeNo)
     IF @@ERROR <> 0
     BEGIN
     GOTO VouchersNoAndCodeNo
     SET @m = @m - 1
     END
     SET @m = @m + 1
    END
 

解决方案 »

  1.   

    在程序中用TRY CATHC捕捉错误
      

  2.   

    修改唯一索引,添加IGNORE_DUP_KEY 选项。
      

  3.   

    因为报的错是不能插入重复值,这个错误是正常的,所以不能在程序里用try/catch,不然执行就中断了,希望忽略这个错,继续执行
      

  4.   

    SQL中TRY的用法
    select 1 
    BEGIN TRY
    SELECT 1/0 
    END TRY
    BEGIN CATCH
    SELECT 0
    END CATCH
    SELECT 2/*-----------
    1(1 行受影响)
    -----------(0 行受影响)
    -----------
    0(1 行受影响)
    -----------
    2(1 行受影响)
    */
      

  5.   

    修改一行代码GOTO VouchersNoAndCodeNo 改为 GOTO GetCodeNo
      

  6.   

    CREATE TABLE TB(ID INT)
    GO
    CREATE UNIQUE INDEX UN_ID  ON TB(ID) WITH IGNORE_DUP_KEY
    GO
    INSERT TB
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 2SELECT * FROM TB
    DROP TABLE TB
    /*
    Duplicate key was ignored.
    ID          
    ----------- 
    1
    2
    */
      

  7.   

    谢谢各位高手的建议,两种方法我都试过,一个是SQL里用TRY/CATCH,另一个是IGNORE_DUP_KEY,用TRY/CATCH脚本改动简单一些,用IGNORE_DUP_KEY改动比较大,还需要判断生成的记录数是否等于指定的记录,缺口的记录需要再生成。
      

  8.   

    还想问个问题,我用过一个替代方法,是用EXISTS先判断是否有重复,没有就INSERT,刚才测试了一下,用TRY/CATCH生成10W的数据比EXISTS慢,是EXISTS效率高于TRY/CATCH,还是数据量小,效果不明显,按我的理解,用EXISTS的话,每次INSERT都要判断,以后表记录越大,速度会越慢,是这样吗?