1

我正在编写一个存储过程,我使用 try catch 块。

现在我在表中有一个独特的列。当我尝试插入重复值时,它会抛出异常,异常号为 2627。

我希望这样做

if (exists(select * from tblABC where col1='value')=true) raiseError(2627)--如果我使用插入查询插入重复值,则会引发系统错误

编辑:

我正在使用在处理异常时回滚的事务,因此导致在先前的查询中执行的 @@Identity 值增加 b4 发生异常。

我想检查实际插入时可能发生的所有此类异常。为此,我将使用 select 语句手动检查可能引发错误的异常if else。在这里,我将能够捕获唯一键违规,但不会发生异常,所以我将在这里故意抛出异常,但我想要的异常应该是系统异常,即错误 2627

哪种方法会更好,使用插入查询或在使用 Select 查询插入之前检查重复值?

是否有可能在手动捕获异常时引发系统异常,即抛出与 SQL 会抛出的相同异常

4

1 回答 1

2

您不能引发系统错误。RAISERROR(2627...) 是非法的。除了您在撒谎(没有发生错误 2627)这一事实之外,您还缺少插入到消息格式中的内容。

应用程序永远不应该依赖 IDENTITY 连续性,您抱怨它“增加自动增量”这一事实表明您的应用程序存在错误(如果不是在代码中,肯定是在设计中)。IDENTITY 值可能包含空白,是其规范的一部分。

至于什么更好,插入和捕获,或尝试更新:这取决于您的流行模式。如果该值可能存在,则 UPDATE first 策略更好。如果该值可能不存在或概率未知,则最好 INSERT 并捕获错误,因为性能原因,更重要的是,正确性(SELECT 检查在并发下永远不会正确)。

于 2010-03-15T21:18:35.417 回答