Повторно использовать T-SQL FOR JSON подзапрос

Вот простой пример вложенного запроса FOR JSON:

select 
    u.Id,
    u.Name,
    (select ue.Email
     from UserEmails ue
     where ue.UserId = u.Id
     for json path
    )
from
    Users u
for json path

Есть ли способ повторно использовать UserEmailsподзапрос? Например, в функции?

Подобно:

select 
    u.Id,
    u.Name,
    u.Email,
    dbo.GetUserEmailsJSON(u.Id)
from
    Users u
for json path

Я также хотел бы иметь возможность позвонить dbo.GetUserEmailsJSON() самостоятельно и вернуть данные в формате JSON.

1 ответ

Разобрался... Следующие работы

Функция:

create function GetUserEmailsJSON
(
    @UserId int
)
returns nvarchar(max)
as
begin
    declare @result nvarchar(max)
    set @result = (
        select *
        from UserEmails ue
        where ue.UserId = @UserId
        for json path, include_null_values
    )

    return @result;
end

И тогда ваш запрос будет выглядеть так:

SELECT u.*
      ,json_query(dbo.GetUserEmailsJSON(u.Id)) 'Emails'
  FROM Users u
  for json path, include_null_values

Единственное, что мне не нравится в этом, так это вызов скалярной функции в качестве подзапроса - это может быть очень утомительно. У кого-нибудь есть другие предложения?

Теперь мне нужно выяснить, как вызвать эту функцию из EF Core и вернуть JSON в объект... Есть предложения?

Другие вопросы по тегам