在存储过程中插入之前检查是否存在

时间:2010-02-15 14:21:16

标签: sql-server sql-server-2005 tsql stored-procedures

在我的存储过程中,我想检查以确保我尝试插入的内容尚未存在于表中。我已经尝试了下面的代码,但它似乎给了我误报(即使它不在表中也是如此)。还有更好的方法吗?

if not exists (select myID from tableName where myID = @myID and otherColumn = @otherColumn)
begin
    insert into tableName
        (
            myID
            , otherColumn
        ) values (
            @myID
            , @otherColumn
        )
end

5 个答案:

答案 0 :(得分:3)

两个想法。

首先,如果涉及NULL,那么“where exists”逻辑可能无法正常工作。

其次,我尝试将其作为一个声明(因为关系数据库的ACID属性),而不是弄乱事务,锁和他们的好朋友阻塞和死锁。以下陈述有效:

INSERT tableName (myId, otherColumn)
 select @myId, @otherColumn
 except select myId, otherColumn
  from tableName

根据表格大小和/或索引问题,这可能对您不起作用;其他变种是可能的,具体取决于您的具体情况。

答案 1 :(得分:1)

可能是并发问题?如果是,请尝试创建事务并使用UPDLOCK提示选择数据。

答案 2 :(得分:1)

UPDLOCK HOLDLOCK 提示添加到SELECT语句并使用事务

答案 3 :(得分:0)

我认为myID和otherColumn上有一个唯一的键。

如果是这样,有多大可能被竞争条件所破坏。很可能你只需要插入并处理任何异常或者更好,但只是允许异常被提升到调用者(毕竟它可能想要通知用户这种情况)。

答案 4 :(得分:0)

问题不在于if语句。遗憾的是,我的逻辑是将值发送到存储过程。