2017-01-03 6 views
7

Я пытаюсь выполнить запрос на слияние в sql-сервере.Проблема с запросом на слияние не выполняется, как и должно быть

В таблице "my_table" имеет 4 столбца "поле" (символ), "дата" (дата), "Вал" (числовое), "редакция" (DateTime)

запрос является как таковой:

MERGE "my_table" AS Target USING (VALUES ('field_example','2017-01-04','0','2017-01-03 12:02:02')) AS Source ("field","date","val","revision") 
        ON (Target."field" = Source."field" AND Target."date" = Source."date") 
        WHEN MATCHED 
        THEN UPDATE SET Target."val" = Source."val",Target."revision" = Source."revision" 
        WHEN NOT MATCHED BY TARGET 
        THEN INSERT ("field","date","val","revision") 
        VALUES (Source."field", Source."date", Source."val", Source."revision") 
        OUTPUT $action, Inserted.*, Deleted.*; 

Как уже есть строка «my_table» с полем = «field_example» и датой = «2017-01-04», я ожидал этот запрос для обновления 2 других столбцов «VAL», "пересмотр ».

я получаю следующий результат запроса:

$action   field  date   revision val   field.1  date.1   revision.1 val.1 
1 UPDATE field_example 2017-01-04 2017-01-03 12:02:02 0 field_example 2017-01-04 2017-01-03 10:09:25 161250 

Так выглядит хорошо (чтобы были обновлены, как это должно быть)

Однако, когда я смотрю в базе данных, то строка не была обновлена ​​(= val по-прежнему 161250 вместо 0, а ревизия еще 2017-01-03 10:09:25)

Любая идея, почему?

+0

Можете добавить примеры данных из вашей таблицы. –

+0

Надеюсь, что нет ROLLBACK или возврата оператора/триггера существует. –

ответ

7

Однако, когда я смотрю в базе данных, то строка не была обновлена ​​(= Допустимы еще 161250 вместо 0, и пересмотр по-прежнему 2017-01-03 10:09:25)

Любая идея, почему?

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

CREATE TABLE dbo.my_table(
    "field" varchar(100) 
    ,"date" date 
    ,"val" int 
    ,"revision" datetime 
    ); 

INSERT INTO my_table ("field","date","val","revision") 
    VALUES ('field_example','2017-01-04','161250','2017-01-03 10:09:25'); 

MERGE "my_table" AS Target USING (VALUES ('field_example','2017-01-04','0','2017-01-03 12:02:02')) AS Source ("field","date","val","revision") 
    ON (Target."field" = Source."field" AND Target."date" = Source."date") 
    WHEN MATCHED THEN 
     UPDATE SET Target."val" = Source."val",Target."revision" = Source."revision" 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT ("field","date","val","revision") 
      VALUES (Source."field", Source."date", Source."val", Source."revision") 
    OUTPUT $action, Inserted.*, Deleted.*; 

SELECT "field","date","val","revision" 
FROM my_table; 
+1

Я полагаю, что команда MERGE отката назад и на выходе все равно то, что она получает. Итак, я считаю, что предположение о том, что пользователь запрашивает неправильную db/table, скорее всего, будет правдой. PS: И да, Merge работал должным образом. –

+4

@AndreasVenieris, моя заметка о откате будет применяться только в том случае, если была явная транзакция перед оператором 'MERGE' и последующим откатом. В этом случае все же будут возвращены (правильные) результаты предложения 'OUTPUT'. –

+0

Извините @ Дан Гузман, я просто добрался до тебя. Да, это возможно. Я думал, вы имеете в виду «MERGE». Извините за недопонимание. Моя вина ;) –