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
sql2000约束是先插入再判断. 从约束的写法就知道了形如value check(value like ...) 即表中对当前行处理的。先插入, 不符规则再删除,然后扔出错误 。 进程中断,@@error捕不到。
从log日志可以看出它的操作。
我用的是SQL2000,所以无法用try ,catch检测,请问还有没有其他方法能实现啊?
用约束来控制数据正确性是乐观策略, 要想自己收集错误信息,还得自己手动去判断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
不会在@@error返回,而是直接出错退出
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
即表中对当前行处理的。先插入, 不符规则再删除,然后扔出错误 。 进程中断,@@error捕不到。
用约束来控制数据正确性是乐观策略,
要想自己收集错误信息,还得自己手动去判断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
我的代码给你做个参考
[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]
返回最后执行的 Transact-SQL 语句的错误代码