Sql server MS SQL Server:将列视为Json
我想要一个函数(MS SQL Server 2016),它可以递归地调用自身来遍历树,并将遍历作为单个Json值返回。我有一个工作代码块,如下所示,但我想做一些事情,而不是我使用的笨拙的JSON_修改。不幸的是,没有它,我找不到办法让它工作。如果您用JSON_MODIFY注释掉代码行并取消注释下一行,您就会明白我的意思 有更好的解决办法吗Sql server MS SQL Server:将列视为Json,sql-server,json,Sql Server,Json,我想要一个函数(MS SQL Server 2016),它可以递归地调用自身来遍历树,并将遍历作为单个Json值返回。我有一个工作代码块,如下所示,但我想做一些事情,而不是我使用的笨拙的JSON_修改。不幸的是,没有它,我找不到办法让它工作。如果您用JSON_MODIFY注释掉代码行并取消注释下一行,您就会明白我的意思 有更好的解决办法吗 DROP TABLE dbo.Node; GO DROP FUNCTION dbo.NodeList; GO CREATE TABLE dbo.Node
DROP TABLE dbo.Node;
GO
DROP FUNCTION dbo.NodeList;
GO
CREATE TABLE dbo.Node (
NodeId INT NOT NULL ,
ParentNodeId INT NULL ,
NodeName NVARCHAR(MAX)
);
GO
INSERT dbo.Node(NodeId, ParentNodeId, NodeName)
VALUES (1, NULL, 'A'), (2, 1, 'B'), (3, 1, 'C'), (4, 3, 'D'), (5, 3, 'E');
GO
CREATE FUNCTION dbo.NodeList(@ParentNodeId INT) RETURNS NVARCHAR(MAX)
AS BEGIN
DECLARE @JsonOut NVARCHAR(MAX) = (
SELECT n.NodeId ,
n.NodeName ,
JSON_MODIFY(dbo.NodeList(n.NodeId), '$.x', '') AS Children
-- dbo.NodeList(n.NodeId) AS Children
FROM dbo.Node n
WHERE ISNULL(n.ParentNodeId, -1) = ISNULL(@ParentNodeId, -1)
FOR JSON AUTO
) ;
RETURN @JsonOut;
END;
GO
PRINT dbo.NodeList(NULL);
GO
JSON_MODIFY的输出正是我想要的
[{"NodeId":1,"NodeName":"A","Children":[{"NodeId":2,"NodeName":"B"},
{"NodeId":3,"NodeName":"C","Children":[{"NodeId":4,"NodeName":"D"},
{"NodeId":5,"NodeName":"E"}]}]}]
。。。但是没有它,一切都会出错
[{"NodeId":1,"NodeName":"A","Children":"[{\"NodeId\":2,\"NodeName\":\"B\"},
{\"NodeId\":3,\"NodeName\":\"C\",\"Children\":\"
[{\\\"NodeId\\\":4,\\\"NodeName\\\":\\\"D\\\"},
{\\\"NodeId\\\":5,\\\"NodeName\\\":\\\"E\\\"}]\"}]"}]
提前感谢您的建议。两件事:
1) JSON_MODIFY()实际上并没有生成我想要的内容。JSON_MODIFY使用原始代码向值中添加一个名为“x”且值为“”的元素
2) 虽然不是一个完美的答案,但用JSON_QUERY()替换JSON_MODIFY()要干净得多(特别是用JSON_QUERY(dbo.NodeList(…),“$”))。这样做不仅更有意义,而且还消除了额外的“x”工件
SQL显然知道,从JSON_MODIFY返回的任何东西实际上都不仅仅是一个NVARCHAR(尽管有签名),但我找不到任何其他方法让SQL认为NVARCHAR就是JSON。两件事:
1) JSON_MODIFY()实际上并没有生成我想要的内容。JSON_MODIFY使用原始代码向值中添加一个名为“x”且值为“”的元素
2) 虽然不是一个完美的答案,但用JSON_QUERY()替换JSON_MODIFY()要干净得多(特别是用JSON_QUERY(dbo.NodeList(…),“$”))。这样做不仅更有意义,而且还消除了额外的“x”工件
SQL显然知道,从JSON_MODIFY返回的任何东西实际上都不仅仅是一个NVARCHAR(尽管它有签名),但我找不到任何其他方法让SQL认为NVARCHAR就是JSON