2009-08-14 3 views
1

У меня есть классический случай ОБНОВЛЕНИЯ или ВСТАВКИ некоторых данных в таблицу. Я не уверен, должен ли я просто выполнить UPDATE, и если я получу нулевой ROWCOUNT, тогда сделайте INSERT. В качестве альтернативы, я слышал слухи о том, что заявление MERGE теперь заменяет это, но я не уверен, как и если это уместно, в этой ситуации.Является синтаксисом Sql2008 MERGE, что я должен делать, здесь?

Вот некоторые примеры SQL, чтобы помочь продемонстрировать это ...

ALTER PROCEDURE [dbo].[InsertLocationName] 
(
    @SomeId INTEGER, 
    @SomeName NVARCHAR(100) 
) 
AS 
BEGIN 
    SET NOCOUNT ON 

    UPDATE TableFoo 
    SET SomeName = @SomeName 
    WHERE SomeId = @SomeId 

    -- Did we update something? 
    IF @@ROWCOUNT <= 0 
     -- Nope, so add the record. 
     INSERT INTO TableFoo 
     VALUES (@SomeName) 

END 

мысли?

ответ

1

Несомненно, синтаксис MERGE, вероятно, самый простой. Вы в основном нужно:

  • целевой таблица для обновления
  • таблицы источника для чтения из
  • условию соединения
  • кучи заявления выполнить для соответствующих или не соответствующих строк.

Так что в основном выглядит примерно так:

MERGE TableFoo as t 
USING TableFooSource as s 
ON t.SomeID = s.SomeID 
WHEN MATCHED THEN 
    UPDATE SET t.SomeName = s.SomeName 
WHEN NOT MATCHED THEN 
    INSERT(SomeName) VALUES(s.SomeName) 
; 

Не забыть точку с запятой в конце концов !!

Марк

PS: Обновлен использовать ваши имена таблиц и полей. Дело здесь в том, что набор данных, которые необходимо обновить, должен быть в исходной таблице (если необходимо, объемный импорт, например, из внешнего файла), а затем выполняется вся операция (все INSERT и UPDATE) в одном выражении SQL.

+0

Марк, может у редактировать свой ответ, используя мой пример SQL? –

+0

@Marc, так что вы не можете иметь таблицу Target, а исходную таблицу - то же самое? –

+0

nope - это не сработает. Вам нужно иметь фактическую таблицу, в которой есть все ваши данные, а затем вам нужна таблица с внесенными изменениями. –

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