Использование команды MERGE с данными JSON - PullRequest
3 голосов
/ 13 мая 2019

Можно ли обновить таблицу напрямую, используя JSON, без вставки во временную таблицу?

Ниже код вставляет данные во временную таблицу и обновляет исходную таблицу.

DECLARE @TempTelecommunicationsNumber AS TABLE (RoleID INT,Number VARCHAR(100),Ext VARCHAR(100))
INSERT INTO @TempTelecommunicationsNumber (RoleID,Number,Ext)
 SELECT     @RoleID, Number,Ext
 FROM       OPENJSON(@TelecommunicationsNumber)
 WITH       (RoleID INT, Number NVARCHAR(256), Ext NVARCHAR(256))

            MERGE Party.TelecommunicationsNumber original
            USING @TempTelecommunicationsNumber modified
            ON (original.RoleID = modified.RoleID)
            WHEN MATCHED
                THEN UPDATE SET
                original.Number = modified.Number,
                original.Ext = modified.Ext
            WHEN NOT MATCHED BY TARGET
                THEN INSERT (RoleID,Number,Ext)
                VALUES (@RoleID,modified.Number,modified.Ext);

Есть ли способ обновить напрямую, как показано ниже.

MERGE Party.TelecommunicationsNumber original
USING OPENJSON(@Json) modified
ON (original.RoleID = modified.RoleID)
WHEN MATCHED
    THEN UPDATE SET
    original.Number = modified.Number,
    original.Ext = modified.Ext
WHEN NOT MATCHED BY TARGET
    THEN INSERT (RoleID,Number,Ext)
    VALUES (@RoleID,modified.Number,modified.Ext);

1 Ответ

2 голосов
/ 13 мая 2019

Да, это возможно, например, с использованием общих табличных выражений:

WITH cte AS (
   SELECT     @RoleID AS RoleID, Number,Ext
   FROM       OPENJSON(@TelecommunicationsNumber)
   WITH       (RoleID INT, Number NVARCHAR(256), Ext NVARCHAR(256))
)
MERGE Party.TelecommunicationsNumber original
USING cte modified
ON (original.RoleID = modified.RoleID)
WHEN MATCHED
    THEN UPDATE SET
    original.Number = modified.Number,
    original.Ext = modified.Ext
WHEN NOT MATCHED BY TARGET
    THEN INSERT (RoleID,Number,Ext)
    VALUES (@RoleID,modified.Number,modified.Ext);

db <> fidde demo

или:

MERGE Party.TelecommunicationsNumber original
USING (SELECT @RoleID AS RoleID, Number,Ext
       FROM   OPENJSON(@TelecommunicationsNumber)
       WITH   (RoleID INT, Number NVARCHAR(256), Ext NVARCHAR(256))) modified
ON (original.RoleID = modified.RoleID)
WHEN MATCHED
    THEN UPDATE SET
    original.Number = modified.Number,
    original.Ext = modified.Ext
WHEN NOT MATCHED BY TARGET
    THEN INSERT (RoleID,Number,Ext)
    VALUES (@RoleID,modified.Number,modified.Ext);
...