我正在编写一个使用try catch块的存储过程。
现在我在表格中有一个独特的列。当我尝试插入重复值时,它抛出异常,异常为2627。
我希望这样做
if(exists(select * from tblABC where col1 ='value')= true) raiseError(2627) - 如果我使用插入查询插入重复值,则会引发系统错误
修改
我使用的事务在处理异常时得到回滚,因此导致在先前的查询中执行的@@ Identity值的增加b4异常发生。
我想检查b4实际插入时可能发生的所有此类异常。为此,我将检查可能使用if else
的select语句手动引发错误的异常。在这里我将能够捕获唯一的密钥违规,但不会发生异常,所以我会故意抛出异常,但我想要的异常应该是系统异常,即错误2627
使用哪种方法会更好 插入查询或检查重复 使用Select插入前的值 查询?
是否有可能提升系统 捕获例外情况除外 手动即表达同样的例外情况
答案 0 :(得分:2)
您不能引发系统错误。 RAISERROR(2627 ......)是非法的。除了你撒谎的事实(没有错误2627发生),你错过了插入消息格式。
应用程序永远不要依赖于IDENTITY的连续性,你抱怨它“增加了自动增量”会让你的应用程序失去一个错误(在设计中肯定,如果没有在代码中)。 IDENTITY值可能包含间隙,是其规范的一部分。
关于什么是更好的,插入和捕获,或尝试更新:它取决于您的流行模式。如果该值可能存在,则UPDATE第一策略更好。如果该值可能不存在或者如果概率未知则最好INSERT并捕获错误,原因是性能,更重要的是正确性(SELECT检查在并发下永远不正确)