2013-05-03 2 views
1

Я использую команду MERGE на SQL Server 2008, чтобы вставить/обновить строку в таблице. Однако целевые и исходные таблицы одинаковы. Итак, я хочу проверить, присутствует ли строка, обновить ее в той же таблице или вставить ее. В любом случае, я не могу получить вставку, используя следующий скрипт.MERGE Self-Join SQL Server

Не могли бы вы никому указать, что происходит не так?

`MERGE INTO Table1 as t 
    USING (SELECT * FROM Table1 WHERE ConsumerId = @ConsumerId AND Table1Id = @Table1Id) AS s 
    ON (t.ConsumerId = s.ConsumerId 
    AND t.Table1Id = s.Table1Id) 
    WHEN MATCHED THEN 
     UPDATE SET 
      VersionNumber = s.VersionNumber + 1 
    WHEN NOT MATCHED THEN 
     INSERT (
      ConsumerId, 
      Table1Id, 
      VersionNumber 
      ) 
     VALUES (
      @ConsumerId, 
      @Table1Id, 
      1 
      ); 

Runnig this says: 0 затронутых строк.

ответ

0

В случае необходимости инструкция UPDATE/INSERT, таблица источников всегда должна содержать значения. Поместите переменные в качестве исходной таблицы и изменений в операторе UPDATE SET VersionNumber на VersionNumber += 1 ИЛИ t.VersionNumber = t.VersionNumber + 1

MERGE INTO Table1 as t 
USING (
     SELECT @ConsumerId AS ConsumerId, 
       @Table1Id AS Table1Id, 
       1 AS VersionNumber 
     ) AS s 
ON (t.ConsumerId = s.ConsumerId AND t.Table1Id = s.Table1Id) 
WHEN MATCHED THEN 
    UPDATE 
    SET VersionNumber += 1 
WHEN NOT MATCHED THEN 
    INSERT (
      ConsumerId, 
      Table1Id, 
      VersionNumber 
      ) 
    VALUES (
      s.ConsumerId, 
      s.Table1Id, 
      s.VersionNumber 
      ); 

Демы на SQLFiddle