проверить наличие перед вставкой в ​​хранимую процедуру - PullRequest
2 голосов
/ 15 февраля 2010

В моей хранимой процедуре я хотел бы убедиться, что то, что я пытаюсь вставить, еще не существует в таблице. Я попробовал приведенный ниже код, но, похоже, он дает мне ложные срабатывания (иначе он становится истинным, даже если его нет в таблице). Есть ли лучший способ?

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

Ответы [ 5 ]

3 голосов
/ 15 февраля 2010

Две мысли.

Во-первых, если задействованы значения NULL, ваша логика "где есть" может работать не так, как вам хотелось бы.

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

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

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

1 голос
/ 15 февраля 2010

add UPDLOCK и HOLDLOCK намекает на ваш оператор SELECT и использует транзакцию

1 голос
/ 15 февраля 2010

Может быть проблема с параллелизмом? Если это так, попробуйте создать транзакцию и выбрать данные с подсказкой UPDLOCK.

0 голосов
/ 04 марта 2010

Проблема была не в операторе if. К сожалению, именно с моей логикой отправлялись значения в хранимую процедуру.

0 голосов
/ 16 февраля 2010

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

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

...