2010-02-15 136 views
2

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

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

回答

0

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

1

也许是一个并发问题?如果是这样,尝试创建一个事务并使用UPDLOCK提示选择数据。

1

添加UPDLOCKHOLDLOCK提示,以你的SELECT语句和使用事务

3

两个念头。

首先,如果涉及NULL,您的“where exists”逻辑可能无法正常工作。其次,我会尝试使它成为一个声明(因为关系数据库的ACID属性),而不是混淆事务,锁和他们的好朋友阻塞和死锁。以下声明有效:

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

根据表大小和/或索引问题,这可能不适用于您;其他变体也是可能的,这取决于你的情况。

0

我认为它有一个独特的关键,超过myID和其他列。

如果是这样,它有多大可能被竞争条件所打破。可能你只需要执行插入操作,并且更好地处理任何异常或可能性,只是允许将异常提交给调用者(毕竟它可能想通知用户这种情况)。

相关问题