OPENJSON is pretty central to manipulating JSON documents in T-SQL.
As we’ve seen, we can use a default schema that will return metadata about the JSON document or we can use an explicit schema where we supply a WITH clause and a PATH to the data that we want.
So far, in our examples we have either used the default schema or an explicit schema – but we have not mixed the two.
Indeed if you try this in a simple query you’ll find it is not possible without the use of APPLY operator.
OPENJSON is actually a table-valued function that parses JSON – either into an explicit schema (that we provide) or the default schema.
We can mix both the default and explicit schema by using CROSS APPLY
Like so
DECLARE @json NVARCHAR(MAX) = N' { "Configuration Property": { "Configuration name": "recovery interval (min)", "Value": 0, "minimum": 0, "maximum": 32767, "value_in_use": 0, "description": "Maximum recovery interval in minutes", "is_dynamic": true, "is_advanced": true } } '; SELECT DS.[key] ,DS.[value] ,DS.[type] ,ES.[Configuration name] ,ES.[Value] ,ES.[minimum] ,ES.[maximum] ,ES.[value_in_use] ,ES.[description] ,ES.[is_dynamic] ,ES.[is_advanced] FROM OPENJSON(@json) AS DS CROSS APPLY OPENJSON(DS.[value]) WITH ( [Configuration name] NVARCHAR(35) ,[Value] NVARCHAR(35) ,[minimum] NVARCHAR(35) ,[maximum] NVARCHAR(35) ,[value_in_use] NVARCHAR(35) ,[description] NVARCHAR(35) ,[is_dynamic] NVARCHAR(35) ,[is_advanced] NVARCHAR(35) ) AS ES GO
This technique can come in extremely handy when attempting to drill down into sub arrays and objects contained in a JSON document.
Notice also that different aliasing (of the default and explicit schema) has allowed us to request data from both the default schema and the explicit schema. This has enabled us to get to the element that is named value – as this name appears in both the default and explicit schema names and thus requires an alias.
I hope this has helped on your SQL Server JSON journey. We’ll see more real soon.
Have a great day
Cheers
Marty