Используя FOR JSON и CTE и сохраните его в переменной - PullRequest
1 голос
/ 19 июня 2019

Как я могу сгенерировать JSON в T-SQL, используя FOR JSON из оператора select, использующего Common Table Expression (CTE), и затем сохранить его в локальной переменной?Без 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) = ( ... ) не работает.

1 Ответ

2 голосов
/ 19 июня 2019

Может быть что-то вроде этого?

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 в качестве подзапроса вместо «WITH».CTE - это не что иное, как «синтаксический сахар», чтобы избежать повторных подзапросов и улучшить читаемость 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
...