【问题标题】:Convert custom SELECT result into JSON将自定义 SELECT 结果转换为 JSON
【发布时间】:2020-08-24 10:24:14
【问题描述】:

我遗漏了一些东西,似乎找不到适合这种情况的任何东西。我想将自定义的SELECT 查询输出到VARIABLE 作为JSON

鉴于以下基本表格和脚本,我可以轻松地将 SELECT 语句的结果从表格转换为 JSON 变量:

DECLARE @Table TABLE
(
    [VALUE] nvarchar(100) Null
);

INSERT INTO @Table
SELECT N'Value 1' UNION ALL
SELECT N'Value 2' UNION ALL
SELECT N'Value 3';

DECLARE @JsonValue nvarchar(max);
SELECT @JsonValue =
(
    SELECT * 
    FROM @Table
    FOR JSON PATH
    , INCLUDE_NULL_VALUES
);
SELECT @JsonValue;

这愉快地输出JSON

[
    { "VALUE": "Value 1" },
    { "VALUE": "Value 2" },
    { "VALUE": "Value 3" }
]

现在,如果我想输出自定义查询:

DECLARE @JsonValue nvarchar(max);
SELECT @JsonValue =
(
    SELECT N'Value 1' AS [VALUE] UNION ALL
    SELECT N'Value 2' UNION ALL
    SELECT N'Value 3'
    FOR JSON PATH
    , INCLUDE_NULL_VALUES
);
SELECT @JsonValue;

我得到: The FOR XML and FOR JSON clauses are invalid in views, inline functions, derived tables, and subqueries when they contain a set operator. To work around, wrap the SELECT containing a set operator using derived table or common table expression or view and apply FOR XML or FOR JSON on top of it.

只运行查询的一部分:

SELECT N'Value 1' AS [VALUE] UNION ALL
SELECT N'Value 2' UNION ALL
SELECT N'Value 3'
FOR JSON PATH
, INCLUDE_NULL_VALUES

结果为@​​987654332@:

[
    { "VALUE": "Value 1" },
    { "VALUE": "Value 2" },
    { "VALUE": "Value 3" }
]

我尝试了一些不同的方法,例如 JSON_QUERY 等,但都失败了。我可以使用 CTE,但这感觉有点矫枉过正。我已经研究了文档,但我似乎无法理解我的不足之处,所以我希望有人有洞察力为我指明正确的方向。

【问题讨论】:

    标签: json sql-server sql-server-2016


    【解决方案1】:

    不要使用一堆UNION ALL查询,而是使用VALUES

    DECLARE @JsonValue nvarchar(max);
    SELECT @JsonValue =
    (
        SELECT V.Value
        FROM (VALUES(N'Value 1'),(N'Value 2'),(N'Value 3'))V([Value])
        FOR JSON PATH , INCLUDE_NULL_VALUES
    );
    SELECT @JsonValue;
    

    或者,如果您必须使用UNION ALL,则合并子查询中的值,然后在其外部使用FOR JSON PATH

    DECLARE @JsonValue nvarchar(max);
    SET @JsonValue = (SELECT [Value]
                      FROM (SELECT N'Value 1' AS [VALUE] UNION ALL
                            SELECT N'Value 2' UNION ALL
                            SELECT N'Value 3') U
                      FOR JSON PATH, INCLUDE_NULL_VALUES);
    SELECT @JsonValue;
    

    【讨论】:

    • 啊,好了,你的第二个就是我需要的。我们无法控制传入的数据,因此包装它是要走的路。非常感谢。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多