Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MS SQL Server:将列视为Json_Sql Server_Json - Fatal编程技术网

Sql server MS SQL Server:将列视为Json

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

我想要一个函数(MS SQL Server 2016),它可以递归地调用自身来遍历树,并将遍历作为单个Json值返回。我有一个工作代码块,如下所示,但我想做一些事情,而不是我使用的笨拙的JSON_修改。不幸的是,没有它,我找不到办法让它工作。如果您用JSON_MODIFY注释掉代码行并取消注释下一行,您就会明白我的意思

有更好的解决办法吗

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