Как мне написать простую вставку или обновление в T-SQL? - PullRequest
2 голосов
/ 31 августа 2011

У меня есть процесс, который я не хочу отслеживать, является ли что-то созданием или обновлением.Отслеживание будет сложным.Я хотел бы выполнить обновление ИЛИ создания.Схема как ...

col1 varchar() (PK)
col2 varchar() (PK)
col3 varchar() (PK)
col4 varchar()

Я думаю о

TRY
{
    INSERT ...
}
CATCH(DuplicateKeyException)
{
    UPDATE ...
}

Что вы предлагаете?

Я хочу убедиться, что я понимаю ответ другого топ-проголосовавшего.Учитывая мою схему, ОБНОВЛЕНИЕ всегда происходит (даже с ВСТАВКОЙ), но вставка происходит только там, где ее нет?

 //UPSERT
INSERT INTO [table]
SELECT [col1] = @col1, [col2] = @col2, [col3] = @col3, [col4] = @col4
FROM [table]
WHERE NOT EXISTS (
    -- race condition risk here?
    SELECT  1 
    FROM [table] 
    WHERE [col1] = @col1 
        AND [col2] = @col2
        AND [col3] = @col3
)

UPDATE [table]
SET [col4] = @col4
WHERE [col1] = @col1 
    AND [col2] = @col2
    AND [col3] = @col3

Ответы [ 2 ]

6 голосов
/ 31 августа 2011
update table1 set col1=1,col2=2,col3=3 where a=1
if @@ROWCOUNT=0
   insert into table1 (col1,col2,col3) values (1,2,3)

Я думаю, что это быстрее, чем сначала проверить существование.

0 голосов
/ 31 августа 2011

Вы можете использовать оператор MERGE (если вы используете T-SQL) или создать запрос, который выполняет INSERT или UPDATE, основываясь на существовании вашего ключа.

Редактировать : ОП отредактировал свой вопрос.Да, технически вы будете запускать UPDATE и INSERT при каждом выполнении этого запроса, но вы будете касаться таблицы только одним из этих операторов в зависимости от того, каким критериям удовлетворяется.

...