约束性错误(包括主键\外键\唯一\check\not null)
不会在@@error返回,而是直接出错退出

解决方案 »

  1.   

    约束性错误(包括主键\外键\唯一\check\not null)
    不会在@@error返回,而是直接出错退出
      

  2.   


    2000若是不想出现"不能在具有唯一索引 'IX_cat' 的对象 'cat' 中插入重复键的行。
    语句已终止。
    "
    的提示,要手动判断表中是否已经存在记录。2005可用TRY-CATCH解决.
    --SQL2005if isdate(@CreatDay) = 1
    BEGIN 
       BEGIN TRY
             insert into 表.....value......
       END TRY
       BEGIN CATCH
         SELECT @Tmp_Return=-2,@Tmp_Message='已经插入今天的记录'
         GOTO FAILURE
       END CATCH
    END
      

  3.   

    sql2000约束是先插入再判断. 从约束的写法就知道了形如value check(value like ...)
    即表中对当前行处理的。先插入, 不符规则再删除,然后扔出错误 。 进程中断,@@error捕不到。
      

  4.   

    从log日志可以看出它的操作。
      

  5.   

    我用的是SQL2000,所以无法用try ,catch检测,请问还有没有其他方法能实现啊?
      

  6.   


    用约束来控制数据正确性是乐观策略,
    要想自己收集错误信息,还得自己手动去判断if isdate(@CreatDay) = 1 
    begin 
    if exists (select 1 from 表 where CreatDay=@CreatDay)
    begin 
      SELECT @Tmp_Return=-2,@Tmp_Message='已经插入今天的记录' 
      GOTO FAILURE 
    end 
    else
    begin
    insert into 表.....value...... 
    end
    end 
      

  7.   

    我的自己解决了 用的手动维护控制的 就是在insert语句前面插入一个语句序列,检测是否已经存在违反惟一性约束的值
    我的代码给你做个参考
    [code=SQL]
    CREATE PROC PVM_userAddNew
    (
    @UserName Varchar(100),
    @Pass_Word Varchar(100),
    @TrueName Varchar(10),
    @UserType bit,

    @UserID int Output,
    @FlagValue int Output
    )As
     Declare @ErrNo int --保存错误号
     Begin Transaction --开始事务 --手动维护数据库唯一性约束
    Declare @ExistName Bit
    Exec PVM_ExistByName 'USERS','userName',@UserName,@ExistName output  --一个存储过程,用于检测是不是已经存在某个字段的值
    If @ExistName = 1 --当前用户名存在,违反唯一性约束
    Begin
      RollBack Transaction
      Select @ErrNo = 3
      Return
    End --添加记录
    Insert Into USERS Values (@UserName,@Pass_Word,@TrueName,@UserType) --记录当前错误号
    Select @ErrNo = @@Error
    --输出参数
    If @ErrNo = 0 --没有错误
       Begin
    Select @UserID = (Select Max(UserID) From USERS)
    Select @FlagValue = 0
       End
    Else --其他错误
       Begin
    Rollback Transaction
    Select @FlagValue = 1
    Return
       End
    Commit Transaction --提交事务
    GO
    [code]
      

  8.   

    @@ERROR
    返回最后执行的 Transact-SQL 语句的错误代码