在SQL的列中查询JSON并创建视图

时间:2018-06-27 10:28:05

标签: sql json sql-server view

我在其中一列中有一个带有JSON的表:

enter image description here

我需要创建一个带有列作为JSON键的视图。由于JSON可能具有不同的键,因此列的选择必须是动态的。

1 个答案:

答案 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分解为可在存储过程中使用的表结构。

尝试一下。