答案 0 :(得分:0)
如果您使用的是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分解为可在存储过程中使用的表结构。
尝试一下。