2010-02-15 3 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

добавить UPDLOCK и HOLDLOCK намеки на ваш ЗЕЬЕСТ и использовать транзакцию,

3

Две мысли.

Во-первых, если задействованы NULL, логика «где существует» может работать не так, как вам бы хотелось.

Во-вторых, я попытался бы сделать это одним утверждением (из-за свойств ACID реляционных баз данных), а не вмешиваться в транзакции, блокировки и их хорошие блокировки друзей и блокировку. Работает следующее заявление:

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

Это может не сработать для вас, в зависимости от размера таблицы и/или проблем с индексацией; возможны другие варианты, в зависимости от ваших обстоятельств.

0

Я понимаю, что есть уникальный ключ над myID и otherColumn.

Если да, то насколько вероятно, что это будет нарушено условием гонки. Предположим, вам просто нужно сделать вставку и обработать любое исключение или probabaly лучше, но просто разрешить исключение для вызова вызывающего (в конце концов, он может сообщить об этом пользователю).

Смежные вопросы