Update table using JSON in SQL
up vote
2
down vote
favorite
Is there a way to update a table using a JSON field in SQL.
{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}
Table structure
ID | FromID | ToID |
1 | 10 | 12 |
2 | 42 | 17 |
3 | 100 | 1 |
If I update the table using the above mentioned JSON file in SQL server the output should be changed as below by matching the FromID
to ID
.
ID | FromID | ToID |
1 | 70 | 12 |
2 | 42 | 17 |
3 | 80 | 1 |
In order to achieve this currently I am using the below query.
DECLARE @Relationship AS TABLE(FromID INT,ToID INT,ID INT)
INSERT INTO @Relationship (FromID,ToID,ID)
SELECT FromID, ToID, ID
FROM OPENJSON(@RelationshipType)
WITH (FromID INT, ToID INT, ID INT)
I am iterating the @Relationship
table and updating the data. Is there a proper way to do it using JSON operations without iterating the temp table.
sql json sql-server tsql
add a comment |
up vote
2
down vote
favorite
Is there a way to update a table using a JSON field in SQL.
{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}
Table structure
ID | FromID | ToID |
1 | 10 | 12 |
2 | 42 | 17 |
3 | 100 | 1 |
If I update the table using the above mentioned JSON file in SQL server the output should be changed as below by matching the FromID
to ID
.
ID | FromID | ToID |
1 | 70 | 12 |
2 | 42 | 17 |
3 | 80 | 1 |
In order to achieve this currently I am using the below query.
DECLARE @Relationship AS TABLE(FromID INT,ToID INT,ID INT)
INSERT INTO @Relationship (FromID,ToID,ID)
SELECT FromID, ToID, ID
FROM OPENJSON(@RelationshipType)
WITH (FromID INT, ToID INT, ID INT)
I am iterating the @Relationship
table and updating the data. Is there a proper way to do it using JSON operations without iterating the temp table.
sql json sql-server tsql
Please see if this answer stackoverflow.com/a/51697340/1220550 helps you (also, that question might be a duplicate of this one).
– Peter B
Nov 19 at 9:17
@PeterB, if I get this "I am iterating the@Relationship
table" correctly, the point is not the reading of the JSON, but the udate in one go...
– Shnugo
Nov 19 at 10:09
@Shnugo. Exactly, Is there a solution in order to update the table directly without feeding the data to a Temp Table or a CTE?
– Harsha W
Nov 19 at 10:10
@HarshaW, just check my answer... You can useUPDATE
with a JOIN, or - my prefered approach - an updatable CTE. At least for me this is better to read...
– Shnugo
Nov 19 at 10:20
@Shnugo Sure, Ill try this and get back to you :-)
– Harsha W
Nov 19 at 10:25
add a comment |
up vote
2
down vote
favorite
up vote
2
down vote
favorite
Is there a way to update a table using a JSON field in SQL.
{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}
Table structure
ID | FromID | ToID |
1 | 10 | 12 |
2 | 42 | 17 |
3 | 100 | 1 |
If I update the table using the above mentioned JSON file in SQL server the output should be changed as below by matching the FromID
to ID
.
ID | FromID | ToID |
1 | 70 | 12 |
2 | 42 | 17 |
3 | 80 | 1 |
In order to achieve this currently I am using the below query.
DECLARE @Relationship AS TABLE(FromID INT,ToID INT,ID INT)
INSERT INTO @Relationship (FromID,ToID,ID)
SELECT FromID, ToID, ID
FROM OPENJSON(@RelationshipType)
WITH (FromID INT, ToID INT, ID INT)
I am iterating the @Relationship
table and updating the data. Is there a proper way to do it using JSON operations without iterating the temp table.
sql json sql-server tsql
Is there a way to update a table using a JSON field in SQL.
{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}
Table structure
ID | FromID | ToID |
1 | 10 | 12 |
2 | 42 | 17 |
3 | 100 | 1 |
If I update the table using the above mentioned JSON file in SQL server the output should be changed as below by matching the FromID
to ID
.
ID | FromID | ToID |
1 | 70 | 12 |
2 | 42 | 17 |
3 | 80 | 1 |
In order to achieve this currently I am using the below query.
DECLARE @Relationship AS TABLE(FromID INT,ToID INT,ID INT)
INSERT INTO @Relationship (FromID,ToID,ID)
SELECT FromID, ToID, ID
FROM OPENJSON(@RelationshipType)
WITH (FromID INT, ToID INT, ID INT)
I am iterating the @Relationship
table and updating the data. Is there a proper way to do it using JSON operations without iterating the temp table.
sql json sql-server tsql
sql json sql-server tsql
edited Nov 19 at 9:11
JohnLBevan
14.1k145102
14.1k145102
asked Nov 19 at 8:32
Harsha W
86511330
86511330
Please see if this answer stackoverflow.com/a/51697340/1220550 helps you (also, that question might be a duplicate of this one).
– Peter B
Nov 19 at 9:17
@PeterB, if I get this "I am iterating the@Relationship
table" correctly, the point is not the reading of the JSON, but the udate in one go...
– Shnugo
Nov 19 at 10:09
@Shnugo. Exactly, Is there a solution in order to update the table directly without feeding the data to a Temp Table or a CTE?
– Harsha W
Nov 19 at 10:10
@HarshaW, just check my answer... You can useUPDATE
with a JOIN, or - my prefered approach - an updatable CTE. At least for me this is better to read...
– Shnugo
Nov 19 at 10:20
@Shnugo Sure, Ill try this and get back to you :-)
– Harsha W
Nov 19 at 10:25
add a comment |
Please see if this answer stackoverflow.com/a/51697340/1220550 helps you (also, that question might be a duplicate of this one).
– Peter B
Nov 19 at 9:17
@PeterB, if I get this "I am iterating the@Relationship
table" correctly, the point is not the reading of the JSON, but the udate in one go...
– Shnugo
Nov 19 at 10:09
@Shnugo. Exactly, Is there a solution in order to update the table directly without feeding the data to a Temp Table or a CTE?
– Harsha W
Nov 19 at 10:10
@HarshaW, just check my answer... You can useUPDATE
with a JOIN, or - my prefered approach - an updatable CTE. At least for me this is better to read...
– Shnugo
Nov 19 at 10:20
@Shnugo Sure, Ill try this and get back to you :-)
– Harsha W
Nov 19 at 10:25
Please see if this answer stackoverflow.com/a/51697340/1220550 helps you (also, that question might be a duplicate of this one).
– Peter B
Nov 19 at 9:17
Please see if this answer stackoverflow.com/a/51697340/1220550 helps you (also, that question might be a duplicate of this one).
– Peter B
Nov 19 at 9:17
@PeterB, if I get this "I am iterating the
@Relationship
table" correctly, the point is not the reading of the JSON, but the udate in one go...– Shnugo
Nov 19 at 10:09
@PeterB, if I get this "I am iterating the
@Relationship
table" correctly, the point is not the reading of the JSON, but the udate in one go...– Shnugo
Nov 19 at 10:09
@Shnugo. Exactly, Is there a solution in order to update the table directly without feeding the data to a Temp Table or a CTE?
– Harsha W
Nov 19 at 10:10
@Shnugo. Exactly, Is there a solution in order to update the table directly without feeding the data to a Temp Table or a CTE?
– Harsha W
Nov 19 at 10:10
@HarshaW, just check my answer... You can use
UPDATE
with a JOIN, or - my prefered approach - an updatable CTE. At least for me this is better to read...– Shnugo
Nov 19 at 10:20
@HarshaW, just check my answer... You can use
UPDATE
with a JOIN, or - my prefered approach - an updatable CTE. At least for me this is better to read...– Shnugo
Nov 19 at 10:20
@Shnugo Sure, Ill try this and get back to you :-)
– Harsha W
Nov 19 at 10:25
@Shnugo Sure, Ill try this and get back to you :-)
– Harsha W
Nov 19 at 10:25
add a comment |
2 Answers
2
active
oldest
votes
up vote
1
down vote
accepted
First, you need to specify the path '$.RelationshipType'
in OPENJSON()
to make it extract the data correctly.
Second, it is possible to JOIN OPENJSON()
results just like any table, also using UPDATE
, as follows:
UPDATE U
SET FromID = J.FromID
FROM YourTable AS U
JOIN OPENJSON(@RelationshipType, '$.RelationshipType')
WITH (ID INT, FromID INT, ToID INT) J
ON J.ID = U.ID
See it in action:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c37ef5a175c0f19e0f990dc6a219ce26
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
add a comment |
up vote
1
down vote
Your OPENJSON
is missing the path... Isn't it?
DECLARE @relationshipType NVARCHAR(MAX)=
N'{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}';
--This is to mock-up your existing data
DECLARE @ExistingTable AS TABLE(ID INT,FromID INT,ToID INT)
INSERT INTO @ExistingTable VALUES(1,10,12),(2,42,17),(3,100,1);
--The query will use two CTEs:
--1) Get the JSON data as list
--2) Bind the new data to the corresponding rows
WITH newData AS
(
SELECT *
FROM OPENJSON(@relationshipType,'$.RelationshipType')
WITH (FromID INT, ToID INT, ID INT)
)
,updatableCTE AS
(
SELECT et.*
,nd.FromID AS newFromID
,nd.ToID AS newToID
FROM @ExistingTable et
INNER JOIN newData nd ON et.ID=nd.ID
)
UPDATE updatableCTE SET FromID=newFromID
,ToID=newToID;
--check the result
SELECT ID,FromID,ToID FROM @ExistingTable;
The result
ID FromID ToID
1 70 12
2 42 17
3 80 1
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
First, you need to specify the path '$.RelationshipType'
in OPENJSON()
to make it extract the data correctly.
Second, it is possible to JOIN OPENJSON()
results just like any table, also using UPDATE
, as follows:
UPDATE U
SET FromID = J.FromID
FROM YourTable AS U
JOIN OPENJSON(@RelationshipType, '$.RelationshipType')
WITH (ID INT, FromID INT, ToID INT) J
ON J.ID = U.ID
See it in action:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c37ef5a175c0f19e0f990dc6a219ce26
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
add a comment |
up vote
1
down vote
accepted
First, you need to specify the path '$.RelationshipType'
in OPENJSON()
to make it extract the data correctly.
Second, it is possible to JOIN OPENJSON()
results just like any table, also using UPDATE
, as follows:
UPDATE U
SET FromID = J.FromID
FROM YourTable AS U
JOIN OPENJSON(@RelationshipType, '$.RelationshipType')
WITH (ID INT, FromID INT, ToID INT) J
ON J.ID = U.ID
See it in action:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c37ef5a175c0f19e0f990dc6a219ce26
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
First, you need to specify the path '$.RelationshipType'
in OPENJSON()
to make it extract the data correctly.
Second, it is possible to JOIN OPENJSON()
results just like any table, also using UPDATE
, as follows:
UPDATE U
SET FromID = J.FromID
FROM YourTable AS U
JOIN OPENJSON(@RelationshipType, '$.RelationshipType')
WITH (ID INT, FromID INT, ToID INT) J
ON J.ID = U.ID
See it in action:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c37ef5a175c0f19e0f990dc6a219ce26
First, you need to specify the path '$.RelationshipType'
in OPENJSON()
to make it extract the data correctly.
Second, it is possible to JOIN OPENJSON()
results just like any table, also using UPDATE
, as follows:
UPDATE U
SET FromID = J.FromID
FROM YourTable AS U
JOIN OPENJSON(@RelationshipType, '$.RelationshipType')
WITH (ID INT, FromID INT, ToID INT) J
ON J.ID = U.ID
See it in action:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c37ef5a175c0f19e0f990dc6a219ce26
edited Nov 19 at 11:01
answered Nov 19 at 10:46
Peter B
12.5k51941
12.5k51941
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
add a comment |
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
Thanks @PeterB, This is what I was looking for
– Harsha W
Nov 19 at 11:20
add a comment |
up vote
1
down vote
Your OPENJSON
is missing the path... Isn't it?
DECLARE @relationshipType NVARCHAR(MAX)=
N'{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}';
--This is to mock-up your existing data
DECLARE @ExistingTable AS TABLE(ID INT,FromID INT,ToID INT)
INSERT INTO @ExistingTable VALUES(1,10,12),(2,42,17),(3,100,1);
--The query will use two CTEs:
--1) Get the JSON data as list
--2) Bind the new data to the corresponding rows
WITH newData AS
(
SELECT *
FROM OPENJSON(@relationshipType,'$.RelationshipType')
WITH (FromID INT, ToID INT, ID INT)
)
,updatableCTE AS
(
SELECT et.*
,nd.FromID AS newFromID
,nd.ToID AS newToID
FROM @ExistingTable et
INNER JOIN newData nd ON et.ID=nd.ID
)
UPDATE updatableCTE SET FromID=newFromID
,ToID=newToID;
--check the result
SELECT ID,FromID,ToID FROM @ExistingTable;
The result
ID FromID ToID
1 70 12
2 42 17
3 80 1
add a comment |
up vote
1
down vote
Your OPENJSON
is missing the path... Isn't it?
DECLARE @relationshipType NVARCHAR(MAX)=
N'{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}';
--This is to mock-up your existing data
DECLARE @ExistingTable AS TABLE(ID INT,FromID INT,ToID INT)
INSERT INTO @ExistingTable VALUES(1,10,12),(2,42,17),(3,100,1);
--The query will use two CTEs:
--1) Get the JSON data as list
--2) Bind the new data to the corresponding rows
WITH newData AS
(
SELECT *
FROM OPENJSON(@relationshipType,'$.RelationshipType')
WITH (FromID INT, ToID INT, ID INT)
)
,updatableCTE AS
(
SELECT et.*
,nd.FromID AS newFromID
,nd.ToID AS newToID
FROM @ExistingTable et
INNER JOIN newData nd ON et.ID=nd.ID
)
UPDATE updatableCTE SET FromID=newFromID
,ToID=newToID;
--check the result
SELECT ID,FromID,ToID FROM @ExistingTable;
The result
ID FromID ToID
1 70 12
2 42 17
3 80 1
add a comment |
up vote
1
down vote
up vote
1
down vote
Your OPENJSON
is missing the path... Isn't it?
DECLARE @relationshipType NVARCHAR(MAX)=
N'{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}';
--This is to mock-up your existing data
DECLARE @ExistingTable AS TABLE(ID INT,FromID INT,ToID INT)
INSERT INTO @ExistingTable VALUES(1,10,12),(2,42,17),(3,100,1);
--The query will use two CTEs:
--1) Get the JSON data as list
--2) Bind the new data to the corresponding rows
WITH newData AS
(
SELECT *
FROM OPENJSON(@relationshipType,'$.RelationshipType')
WITH (FromID INT, ToID INT, ID INT)
)
,updatableCTE AS
(
SELECT et.*
,nd.FromID AS newFromID
,nd.ToID AS newToID
FROM @ExistingTable et
INNER JOIN newData nd ON et.ID=nd.ID
)
UPDATE updatableCTE SET FromID=newFromID
,ToID=newToID;
--check the result
SELECT ID,FromID,ToID FROM @ExistingTable;
The result
ID FromID ToID
1 70 12
2 42 17
3 80 1
Your OPENJSON
is missing the path... Isn't it?
DECLARE @relationshipType NVARCHAR(MAX)=
N'{
"RelationshipType" : [
{
"ID" : 1,
"FromID" : 70,
"ToID" : 12
},
{
"ID" : 3,
"FromID" : 80,
"ToID" : 1
}
]
}';
--This is to mock-up your existing data
DECLARE @ExistingTable AS TABLE(ID INT,FromID INT,ToID INT)
INSERT INTO @ExistingTable VALUES(1,10,12),(2,42,17),(3,100,1);
--The query will use two CTEs:
--1) Get the JSON data as list
--2) Bind the new data to the corresponding rows
WITH newData AS
(
SELECT *
FROM OPENJSON(@relationshipType,'$.RelationshipType')
WITH (FromID INT, ToID INT, ID INT)
)
,updatableCTE AS
(
SELECT et.*
,nd.FromID AS newFromID
,nd.ToID AS newToID
FROM @ExistingTable et
INNER JOIN newData nd ON et.ID=nd.ID
)
UPDATE updatableCTE SET FromID=newFromID
,ToID=newToID;
--check the result
SELECT ID,FromID,ToID FROM @ExistingTable;
The result
ID FromID ToID
1 70 12
2 42 17
3 80 1
answered Nov 19 at 10:08
Shnugo
47.6k72466
47.6k72466
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53370886%2fupdate-table-using-json-in-sql%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Please see if this answer stackoverflow.com/a/51697340/1220550 helps you (also, that question might be a duplicate of this one).
– Peter B
Nov 19 at 9:17
@PeterB, if I get this "I am iterating the
@Relationship
table" correctly, the point is not the reading of the JSON, but the udate in one go...– Shnugo
Nov 19 at 10:09
@Shnugo. Exactly, Is there a solution in order to update the table directly without feeding the data to a Temp Table or a CTE?
– Harsha W
Nov 19 at 10:10
@HarshaW, just check my answer... You can use
UPDATE
with a JOIN, or - my prefered approach - an updatable CTE. At least for me this is better to read...– Shnugo
Nov 19 at 10:20
@Shnugo Sure, Ill try this and get back to you :-)
– Harsha W
Nov 19 at 10:25