SQL Сервер MERGE с условиями без слияния - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь сделать простое обновление моей таблицы, когда сборщик имеет данные, отличные от финальной таблицы. Я использую код ниже. Когда запускается первый SELECT, он говорит мне, что оба столбца содержат данные. После выполнения оператора MERGE и нового SELECT оба столбца по-прежнему отображаются как NULL. Слияние ничего не обновляет.

Я как-то испортил синтаксис MERGE?

Код производства, который у меня есть, также включает WHEN NOT MATCHED и другие предметы. Это лишь небольшой пример, демонстрирующий проблему.

SELECT l.Region_Name, l.Region_Code
FROM dbo.Collector_Locations l
WHERE l.id = 1038

MERGE INTO dbo.Locations AS T
USING dbo.Collector_Locations S ON T.id = S.id

WHEN MATCHED AND (T.Region_Name <> S.Region_Name OR T.Region_Code <> S.Region_Code)     
    THEN 
        UPDATE SET T.Region_Name = S.Region_Name,
                   T.Region_Code = S.Region_Code;

SELECT l.Region_Name, l.Region_Code
FROM dbo.Locations l
WHERE l.id = 1038

1 Ответ

0 голосов
/ 31 января 2020

Изменение запроса для размещения значений NULL:

MERGE dbo.Locations AS T
USING dbo.Collector_Locations S 
ON T.id = S.id
WHEN MATCHED AND (ISNULL(T.Region_Name,'a') <> S.Region_Name OR ISNULL(T.Region_Code,'a') <> S.Region_Code) THEN UPDATE SET
    T.Region_Name = S.Region_Name,
    T.Region_Code = S.Region_Code;

Кроме того, синтаксис выглядит нормально. Это должно сработать.

РЕДАКТИРОВАТЬ:

Я бы однако go для оператора UPDATE в этом сценарии:

UPDATE dbo.Locations
SET T.Region_Name = S.Region_Name,T.Region_Code = S.Region_Code
FROM dbo.Locations T 
    INNER JOIN dbo.Collector_Locations S 
        ON T.id = S.id AND (T.Region_Name <> S.Region_Name OR T.Region_Code <> S.Region_Code)

Вы также может принять наш последний набор условий соединения, поскольку ожидаемый конечный результат будет таким же:

UPDATE dbo.Locations
    SET T.Region_Name = S.Region_Name,T.Region_Code = S.Region_Code
    FROM dbo.Locations T 
        INNER JOIN dbo.Collector_Locations S 
            ON T.id = S.id 
...