Если вы используете SQL 2016 и выше, вы можете использовать функцию OPONJSON
, однако вам потребуется указать путь (внутри фрагмента кода json), который не может быть динамическим.
Вы можете использовать следующую пользовательскую функцию определения для извлечения всех элементов из JSON до последнего уровня, например массив / объект JSON внутри самого JSON.
это функция:
CREATE FUNCTION [dbo].[JsonTable] (@Json NVARCHAR(MAX))
RETURNS TABLE AS RETURN
WITH jsonRoot AS (
SELECT
0 as parentLevel,
CONVERT(nvarchar(4000),NULL) as parentElementName,
0 AS [level],
[type] ,
@Json AS ElementName,
[key] as [Key],
[value],
ROW_NUMBER() OVER (ORDER BY (SELECT null)) AS ElementSequence
FROM
OPENJSON(@Json, '$')
UNION ALL
SELECT
jsonRoot.[level] as parentLevel,
CONVERT(nvarchar(4000),jsonRoot.ElementName) as parentElementName,
jsonRoot.[level]+1 as [level],
d.[type] as [type],
CASE WHEN jsonRoot.[type] IN (4,5) THEN CONVERT(nvarchar(4000),jsonRoot.[Key]) ELSE jsonRoot.ElementName END as ElementName,
CASE WHEN jsonRoot.[type] IN (4) THEN jsonRoot.[Key] ELSE d.[key] END as [Key],
d.[value],
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ElementSequence
FROM
jsonRoot
CROSS APPLY OPENJSON(jsonRoot.[value], '$') d
WHERE
jsonRoot.[type] IN (4,5)
)
SELECT parentLevel , parentElementName ,[level] , [type] , ElementName , [Key] ,[value], ElementSequence
FROM jsonRoot
Вы можете использовать его следующим образом:
SELECT type , x.*
FROM YourTable t
CROSS APPLY dbo.JsonTable (t.JSON) x
Это разбивает JSON на структуру таблицы, с которой вы можете работать в хранимой процедуре.
Дайте ему попытку.