I am trying to insert a JSON file into a table using SQL Server’s “OPENJSON WITH (…” syntax). However, this file contains nested arrays, which I do not know how to handle.
Here is my JSON file:
} "Person_ID":["7120","4816","6088"], "Occupant_Type":["ADT","SCD","MCD"], "Occupant_Gender":["M","F","M"], "Occupant_Height":[180,102,127], "Occupant_Weight":[68,20,22], "Occupant_Age":[23,2.5,5.5], "Occupied_Region":[], "Occupant_Type_Region":[] }
and here is the code I tried to use:
DECLARE @test_data varchar(max) SELECT @test_data = BulkColumn FROM OPENROWSET (BULK 'C:UsersofiriOneDriveDesktopאופירBWRData for testingchevrolet_spark json files3.03.2020 copy14', SINGLE_CLOB) import insert into Person1([ID]) select [ID] from openjson(@test_data,'$."Person_ID"') with( [ID] VARCHAR '$."Person_ID"' ) cross apply openjson (@test_data,'$."Occupant_Type"')
But after I run the code, all the attributes in the table are null
.
How can I insert the values into my table?
Advertisement
Answer
The syntax might be different and depends on the expected results. Of course, the destination table structure is also important. Note, that the JSON in the question has a typing error. The correct JSON is:
DECLARE @json nvarchar(max) = N' { "Person_ID":["7120","4816","6088"], "Occupant_Type":["ADT","SCD","MCD"], "Occupant_Gender":["M","F","M"], "Occupant_Height":[180,102,127], "Occupant_Weight":[68,20,22], "Occupant_Age":[23,2.5,5.5], "Occupied_Region":[], "Occupant_Type_Region":[] }'
The error in your OPENSON()
call is the wrong path – $.Person_ID
instead of $
. If you want to parse each nested JSON array separately, you should use OPENJSON()
with explicit schema and the correct statement is:
SELECT [ID] FROM OPENJSON (@json, '$.Person_ID') WITH ([ID] varchar(4) '$')
and the result is:
ID 7120 4816 6088
But if the JSON holds the information for different persons, you should probably use OPENJSON()
with default schema and a statement like the following:
SELECT j1.[value] AS Person_ID, j2.[value] AS Occupant_Type, j3.[value] AS Occupant_Gender, j4.[value] AS Occupant_Height, j5.[value] AS Occupant_Weight, j6.[value] AS Occupant_Age, j7.[value] AS Occupied_Region, j8.[value] AS Occupant_Type_Region FROM OPENJSON(@json, '$."Person_ID"') j1 FULL JOIN OPENJSON(@json, '$."Occupant_Type"') j2 ON j1.[key] = j2.[key] FULL JOIN OPENJSON(@json, '$."Occupant_Gender"') j3 ON j1.[key] = j3.[key] FULL JOIN OPENJSON(@json, '$."Occupant_Height"') j4 ON j1.[key] = j4.[key] FULL JOIN OPENJSON(@json, '$."Occupant_Weight"') j5 ON j1.[key] = j5.[key] FULL JOIN OPENJSON(@json, '$."Occupant_Age"') j6 ON j1.[key] = j6.[key] FULL JOIN OPENJSON(@json, '$."Occupied_Region"') j7 ON j1.[key] = j7.[key] FULL JOIN OPENJSON(@json, '$."Occupant_Type_Region"') j8 ON j1.[key] = j8.[key]
with result:
Person_ID Occupant_Type Occupant_Gender Occupant_Height Occupant_Weight Occupant_Age Occupied_Region Occupant_Type_Region 7120 ADT M 180 68 23 4816 SCD F 102 20 2.5 6088 MCD M 127 22 5.5