Я использую MERGE
для синхронизации данных в таблице и вижу неправильное (для меня) поведение SQL Server. Когда я OUTPUT
значения INSERTED.*
и строка была удалена, команда MERGE
возвращает строку со всеми NULL
столбцами для каждой удаленной строки.
Например, возьмем эту схему:
CREATE TABLE tbl
(
col1 INT NOT NULL,
col2 INT NOT NULL
);
Я делаю первоначальную загрузку данных, и все 4 строки выводятся, как и ожидалось.
WITH data1 AS (
SELECT 1 [col1],1 [col2]
UNION ALL SELECT 2 [col1],2 [col2]
UNION ALL SELECT 3 [col1],3 [col2]
UNION ALL SELECT 4 [col1],4 [col2]
)
MERGE tbl t
USING data1 s
ON t.col1 = s.col1 AND t.col2 = s.col2
WHEN NOT MATCHED BY TARGET
THEN INSERT (col1,col2) VALUES (s.col1,s.col2)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT INSERTED.*;
Теперь, скажем, я удаляю 2 строки из данных, которые я синхронизирую с таблицей (в моем CTE), и делаю то же самое MERGE
, я вижу возвращенные 2 строки всех столбцов NULL
.
WITH data1 as (
SELECT 1 [col1],1 [col2]
UNION ALL SELECT 2 [col1],2 [col2]
)
MERGE tbl t
USING data1 s
ON t.col1 = s.col1 AND t.col2 = s.col2
WHEN NOT MATCHED BY TARGET
THEN INSERT (col1,col2) VALUES (s.col1,s.col2)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT INSERTED.*;
Для меня это кажется неправильным поведением, потому что A) я не делал этого для каких-либо удаленных строк и B) это создает впечатление, что я вставил эти 2 строки NULL
в свою таблицу, чего я явно не делал. Кто-нибудь может пролить свет на происходящее?
$action
в предложении вывода, чтобы различать. - person Laurence   schedule 12.09.2014OUTPUT deleted.*, $action, inserted.col1 as x, inserted.col2 as y
- person Laurence   schedule 12.09.2014