使用 FOR JSON 和 CTE 并将其存储在变量中

Using FOR JSON and CTE and store it in a variable

如何从使用通用 Table 表达式 (CTE) 的 select 语句中使用 FOR JSON 在 T-SQL 中生成 JSON然后将其存储在局部变量中? 如果没有 CTE,它可能看起来像这样:

DECLARE @var NVARCHAR(MAX) = (
    SELECT  x.Val
    FROM (VALUES (1)) AS x(Val)
    FOR JSON AUTO
)
SELECT @var

但是,如果像下面这样使用 CTE,语法会怎样?

WITH y AS (
    SELECT  Val
    FROM (VALUES (1)) AS _(Val)
)
SELECT  x.Val, y.Val ValY
FROM (VALUES (1)) AS x(Val)
JOIN y ON y.Val = x.Val
FOR JSON AUTO

DECLARE @var NVARCHAR(MAX) = ( ... )包围是行不通的。

可能是这样的?

DECLARE @json NVARCHAR(MAX);

WITH y AS (
    SELECT  Val
    FROM (VALUES (1)) AS _(Val)
)
SELECT @json=
(
    SELECT  x.Val, y.Val ValY
    FROM (VALUES (1)) AS x(Val)
    JOIN y ON y.Val = x.Val
    FOR JSON AUTO
);

SELECT @json;

此外,您可以将 CTE 作为 sub-query 而不是 "WITH"。 CTE 不超过 "syntactic sugar" 实际上是为了避免重复 sub-queries 并让你的 SQL 更易读。您可以将其用于相同的用途:

DECLARE @json NVARCHAR(MAX)=
(
    SELECT  x.Val, y.Val ValY
    FROM (VALUES (1)) AS x(Val)
    JOIN (
            SELECT  Val
            FROM (VALUES (1)) AS _(Val)
         ) y ON y.Val = x.Val
    FOR JSON AUTO
);

SELECT @json