Insert multiple level JSON data into SQL Server
2016 -
There are some specific examples for OPENJSON read nested JSON –
Now Native JSON support in SQL Server 2016 and it
provides you some functions to read and parse your JSON object to table format.
1. The
OPENJSON () table value function transforms JSON
object to one or many rows. It will not execute any command. It just
returns a table row if JSON text is properly formatted. OPENJSON function will
also work with JSON arrays and this function can also open nested/hierarchical
JSON objects. OPENJSON will just return set of rows instead of
single row.
2. The
JSON_Value () is a scalar function
and used to returns a value from JSON on the specified path.
There are some specific examples for OPENJSON read nested JSON –
Example 1 – OPENJSON AND
JSON INPUT
DECLARE @json NVARCHAR(MAX)
SET @json=N'{
"Name":"Anil",
"Surname":"Singh",
"Age":32,
"Skills":["SQL","C#","MVC","Angular
2, 4 and 5"]
}'
SELECT * FROM OPENJSON(@json);
Result –
Example 2 – OPENJSON AND
JSON INPUT
DECLARE @json NVARCHAR(MAX)
set @json =N'[
{
"CREATE_DT": 3443434343,
"INCLUDEIND_IND": true,
"CREATE_BY":
"admin",
"DOMAIN_ID": "Cable
Length",
"UPDATE_BY": null,
"VISIBLE": true,
"SOURCE": "OSB",
"MIN_VALUE": 2,
"UPDATE_DT": null,
"VERSION": 1,
"MAX_VALUE": 10
},
{
"CREATE_DT": 34334343433,
"INCLUDEIND_IND": true,
"CREATE_BY": "admin",
"DOMAIN_ID":
"Number",
"UPDATE_BY": null,
"VISIBLE": true,
"SOURCE": "COB",
"MIN_VALUE": 1,
"UPDATE_DT": null,
"VERSION": 1,
"MAX_VALUE": 10
},
{
"CREATE_DT": 3434343,
"INCLUDEIND_IND": true,
"CREATE_BY":
"admin",
"DOMAIN_ID":
"Number_concurrent_access",
"UPDATE_BY": null,
"VISIBLE": true,
"SOURCE": "OCB",
"MIN_VALUE": 1,
"UPDATE_DT": null,
"VERSION": 1,
"MAX_VALUE": 5
}]'
CREATE TABLE TBL_ConvertJSONToTableObject(
CREATE_DT VARCHAR(30),
INCLUDEIND_IND VARCHAR(30),
CREATE_BY VARCHAR(30),
DOMAIN_ID VARCHAR(30) ,
UPDATE_BY VARCHAR(30) ,
VISIBLE VARCHAR(30) ,
SOURCE VARCHAR(30)
,
MIN_VALUE VARCHAR(30) ,
UPDATE_DT VARCHAR(30) ,
VERSION VARCHAR(30) ,
MAX_VALUE VARCHAR(30) ,
)
INSERT INTO TBL_ConvertJSONToTableObject (
CREATE_DT,
INCLUDEIND_IND,
CREATE_BY,
DOMAIN_ID,
UPDATE_BY,
VISIBLE ,
SOURCE ,
MIN_VALUE,
UPDATE_DT,
VERSION ,
MAX_VALUE
)
SELECT * FROM OPENJSON (@json)
WITH(
CREATE_DT VARCHAR(30) '$.CREATE_DT',
INCLUDEIND_IND VARCHAR(30) '$.INCLUDEIND_IND',
CREATE_BY VARCHAR(30) '$.CREATE_BY',
DOMAIN_ID VARCHAR(30) '$.DOMAIN_ID',
UPDATE_BY VARCHAR(30) '$.UPDATE_BY',
VISIBLE VARCHAR(30) '$.VISIBLE',
SOURCE VARCHAR(30) '$.SOURCE',
MIN_VALUE VARCHAR(30) '$.MIN_VALUE',
UPDATE_DT VARCHAR(30) '$.UPDATE_DT',
VERSION VARCHAR(30) '$.VERSION',
MAX_VALUE VARCHAR(30) '$.MAX_VALUE'
)
SELECT * FROM
TBL_ConvertJSONToTableObject
Result –
Example 3 – USING
JSON_VALUE() WITH OPENJSON() FUNCTION
DECLARE @json NVARCHAR(1000)
SELECT @json = N'{
"Orders": [
{
"OrderID": 10100,
"CustomerID": 202000,
"OrderDetail": [{
"ProductID": 302000,
"UnitPrice": 4350
},
{
"ProductID": 203000,
"UnitPrice": 4450
},
{
"ProductID": 43000,
"UnitPrice": 5560
}]
}]
}'
SELECT JSON_Value (c.value, '$.OrderID') as OrderID,
JSON_Value (c.value, '$.CustomerID') as CustomerID,
JSON_Value (p.value, '$.ProductID') as ProductID,
JSON_Value (p.value, '$.UnitPrice') as UnitPrice
FROM OPENJSON (@json, '$.Orders') as c
CROSS APPLY OPENJSON (c.value, '$.OrderDetail') as p
Result –