This simple script helps you prepare the WITH statement part for the OPENJSON() function. For large JSON data it will scan all nodes and build a distinct list of all available elements. You can adjust it for your needs (different nesting level etc.).
DECLARE @JSON NVARCHAR(MAX) SET @JSON = N'{ "Employees": [ { "Id": 1, "FirstName": "John", "LastName": "Doe" }, { "Id": 2, "FirstName": "Paula", "LastName": "Klein", "BornName": "Smith", "Address": "Cross road 123, NY", "Married": true, "Kids": ["Ema", "Nick"] } ] }' SELECT DISTINCT '[' + [g].[Key] + '] ' + CASE [g].[Type] WHEN 1 THEN 'NVARCHAR(4000)' WHEN 2 THEN 'INT' WHEN 3 THEN 'BIT' WHEN 4 THEN 'NVARCHAR(MAX) AS JSON' WHEN 5 THEN 'NVARCHAR(MAX) AS JSON' ELSE 'X' END + ' ''$.' + [g].[Key] + ''',' FROM OPENJSON(@JSON) [e] CROSS APPLY OPENJSON([e].[Value]) [f] CROSS APPLY OPENJSON([f].[Value]) [g] ORDER BY 1 SELECT [g].* FROM OPENJSON(@JSON) [e] CROSS APPLY OPENJSON([e].[Value]) [f] CROSS APPLY OPENJSON([f].[Value]) WITH ( [Address] NVARCHAR(4000) '$.Address', [BornName] NVARCHAR(4000) '$.BornName', [FirstName] NVARCHAR(4000) '$.FirstName', [Id] INT '$.Id', [LastName] NVARCHAR(4000) '$.LastName', [Married] BIT '$.Married', [Kids] NVARCHAR(MAX) '$.Kids' AS JSON ) [g] GO