5

Is it possible to update a table directly using JSON, without inserting to a temp table?

Below code inserts data to a temp table and updates the original table.

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);

Is there a way to update directly as below.

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 Answer 1

9

Yes it is possible for instance by using common table expressions:

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

or:

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);
Sign up to request clarification or add additional context in comments.

3 Comments

Could you please help me: I would like to convert HEX to bigint using your above solution (fidde demo). But I don't know the right syntax. I tried several times but got an error.
@SaurabhChauhan It is beyond scope of this particular answer. Please ask new question, and provide initial and desired output.
Could you please help me here: stackoverflow.com/questions/61746221/… I will update the question. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.