如何使用 Microsoft SQL Server 2016 生成树状 JSON 数据?

 随着 JSON 的流行,SQL Server 2016 开始支持 JSON 数据类型,不仅可以直接输出 JSON 格式的结果集,还能读取 JSON 格式的数据。对于有用到 JSON格 式的应用程序来说,这无疑是一利器,因为不再需要使用 JSON.Net 这类工具进行分析和处理 JSON 数据,直接利用 SQL Server 内置函数就可以处理,轻松将查询结果输出为 JSON 格式,或者搜索JSON文件内容。下面通过实例的方式,展现 SQL Server 2016 这一新功能,直接生成树状 JSON 数据。

     首先创建测试表:

CREATE TABLE Persons(PersonId int, FatherId int, Name nvarchar(20));
GO
INSERT INTO Persons(PersonId, FatherId, Name)
VALUES
(1, NULL, '天祖父'),
(2, 1, '高祖父'),
(3, 2, '曾祖父'),
(4, 3, '祖父'),
(5, 4, '父亲'),
(6, 4, '叔叔'),
(7, 6, '堂兄弟'),
(8, 5, '兄弟'),
(9, 5, '我');

创建递归函数 fnPersonTreeJson:

CREATE  FUNCTION fnPersonTreeJson(@PersonId INT, @IsRoot INT ) 
RETURNS VARCHAR(MAX)
BEGIN 
    DECLARE @Json NVARCHAR(MAX) = '{}', @Name NVARCHAR(MAX) , @Children  NVARCHAR(MAX)

    SET @Json =  
    (SELECT P.Name ,JSON_QUERY(dbo.fnPersonTreeJson(P.PersonId, 2) ) AS Children 
    FROM dbo.Persons AS P  
    WHERE P.FatherId = @PersonId 
    FOR JSON AUTO);

    IF(@IsRoot = 1) 
    BEGIN
       SELECT @Name = P.Name FROM dbo.Persons AS P WHERE P.PersonId = @PersonId
       SET @Json =   '{"Name":"' + @Name + '","Children":' + CAST(@Json AS NVARCHAR(MAX)) + '}'
       SET @IsRoot = 2
    END

    RETURN @Json 
END

效果如下:

 查询根节点

SELECT dbo.fnPersonTreeJson(1,1) PersonJson

{
    "Name": "天祖父",
    "Children": [
        {
            "Name": "高祖父",
            "Children": [
                {
                    "Name": "曾祖父",
                    "Children": [
                        {
                            "Name": "祖父",
                            "Children": [
                                {
                                    "Name": "父亲",
                                    "Children": [
                                        {
                                            "Name": "兄弟"
                                        },
                                        {
                                            "Name": "我"
                                        }
                                    ]
                                },
                                {
                                    "Name": "叔叔",
                                    "Children": [
                                        {
                                            "Name": "堂兄弟"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值