从SQL表中获取嵌套JSON

从SQL表中获取嵌套JSON,sql,json,sql-server,Sql,Json,Sql Server,下面是我的表格数据 下面是创建表的SQL查询 CREATE TABLE [dbo].[CategoryMaster]( [CategoryId] [int] NOT NULL, [ParentId] [int] NULL, [Name] [varchar](50) NULL, CONSTRAINT [PK_CategoryMaster] PRIMARY KEY CLUSTERED ( [CategoryId] ASC )WITH (PAD_INDEX = O

下面是我的表格数据

下面是创建表的SQL查询

CREATE TABLE [dbo].[CategoryMaster](
    [CategoryId] [int] NOT NULL,
    [ParentId] [int] NULL,
    [Name] [varchar](50) NULL,
 CONSTRAINT [PK_CategoryMaster] PRIMARY KEY CLUSTERED 
(
    [CategoryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (1, NULL, N'Toys & Games')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (2, 1, N'Art And Crafts')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (3, 1, N'Baby & Toddler Toys')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (4, 1, N'Bikes, Trikes & Ride-Ons')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (5, 2, N'Aprons & Smocks')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (6, 2, N'Blackboards & Whiteboards')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (7, 2, N'Clay & Dough')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (8, 1, N'Pretend Play')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (9, 8, N'Kitchen Toys')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (10, 9, N'Cooking Appliances')
GO
INSERT [dbo].[CategoryMaster] ([CategoryId], [ParentId], [Name]) VALUES (11, 9, N'Cookware')
GO
ALTER TABLE [dbo].[CategoryMaster]  WITH CHECK ADD  CONSTRAINT [FK_CategoryMaster_CategoryMaster] FOREIGN KEY([ParentId])
REFERENCES [dbo].[CategoryMaster] ([CategoryId])
GO
ALTER TABLE [dbo].[CategoryMaster] CHECK CONSTRAINT [FK_CategoryMaster_CategoryMaster]
GO

我尝试了许多查询,但没有得到想要的结果。有人能帮我摆脱这种局面吗? 我想输出如下。

您可以创建如下递归函数:

CREATE FUNCTION Create_Json(@CategoryId 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.Create_Json(P.CategoryId, 2) ) AS Children 
                    FROM [dbo].[CategoryMaster] AS P  
                    WHERE P.ParentId = @CategoryId 
                    FOR JSON AUTO);
    IF(@IsRoot = 1) 
    BEGIN
       SELECT @Name = P.[Name] FROM [dbo].[CategoryMaster] AS P WHERE P.CategoryId = @CategoryId
       SET @Json =   '"result": {"Name":"' + @Name + '","Children":' + CAST(@Json AS NVARCHAR(MAX)) + '}'
       SET @IsRoot = 0
    END
    RETURN @Json 
END 
把它叫做:

select dbo.Create_Json(1, 1)

请找到DBFIDLE

@Gaurangs谢谢!我对Json的研究不多,所以我在互联网上搜索了你的问题,找到了答案,并根据你的情况复制了解决方案(几乎没有改动)。