Как преобразовать результаты в набор строк jsons с T-SQL - PullRequest
1 голос
/ 29 сентября 2019

У меня проблемы с этим запросом, и я начинаю думать, что это вообще невозможно с SQL Server.

У меня следующий очень простой тестовый запрос:

select 
    t.*
from 
    (values 
        (1, 'foo1', cast('1977-05-19' as date), cast(1 as bit) , null),
        (2, 'foo2', cast('1978-05-19' as date), cast(0 as bit), 'bar2'),
        (3, 'foo3', cast('1979-05-19' as date), null, 'bar3')) t(Id, Foo, Day, Bool, Bar)

И если я хочу преобразовать результаты в JSON, я просто добавляю for json auto в конце и получаю хорошие результаты JSON, как я и ожидал:

[
    {"Id":1,"Foo":"foo1","Day":"1977-05-19","Bool":true},    
    {"Id":2,"Foo":"foo2","Day":"1978-05-19","Bool":false,"Bar":"bar2"},
    {"Id":3,"Foo":"foo3","Day":"1979-05-19","Bar":"bar3"}
]

Однако я не хочувернуть весь текстовый BLOB-объект JSON с сервера, я просто хочу набор записей json или строк json, где результаты будут выглядеть примерно так:

Rows
-----------------------------------------------------------------------
{"Id":1,"Foo":"foo1","Day":"1977-05-19","Bool":true}
{"Id":2,"Foo":"foo2","Day":"1978-05-19","Bool":false,"Bar":"bar2"}
{"Id":3,"Foo":"foo3","Day":"1979-05-19","Bar":"bar3"}

Возможно ли это вообще?

I 'Мы потеряли весь день, пытаясь сделать что-то тривиальное, как это.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Вы хотите сериализовать строки как JSON, а не целый набор записей ...

select [Rows] = (select t.* for json path, without_array_wrapper)
from (values
  (1, 'foo1', cast('1977-05-19' as date), cast(1 as bit) , null),
  (2, 'foo2', cast('1978-05-19' as date), cast(0 as bit), 'bar2'),
  (3, 'foo3', cast('1979-05-19' as date), null, 'bar3')
) t (Id, Foo, Day, Bool, Bar)
Rows
------------------------------------------------------------------
{"Id":1,"Foo":"foo1","Day":"1977-05-19","Bool":true}
{"Id":2,"Foo":"foo2","Day":"1978-05-19","Bool":false,"Bar":"bar2"}
{"Id":3,"Foo":"foo3","Day":"1979-05-19","Bar":"bar3"}
0 голосов
/ 30 сентября 2019

У вас уже есть ответ, но я бы хотел добавить альтернативу.

Если честно: мой код не сильно отличается от принятого ответа.Он просто передает суб-выбор в APPLY.Двигатель будет работать примерно так же, вероятно, ... Вероятно, это скорее вопрос вкуса; -)

Вы можете использовать APPLY для любого построчного действия.,В этом случае мы можем добавить столбец, отражающий всю строку как json, просто с помощью этого:

A mockup-script для имитации таблицы

DECLARE @mockupTable TABLE(Id INT, Foo VARCHAR(100), [Day] DATE, Bool BIT, Bar VARCHAR(100));
INSERT INTO @mockupTable(Id, Foo, Day, Bool, Bar) VALUES 
        (1, 'foo1', '19770519', 1, null),
        (2, 'foo2', '19780519', 0, 'bar2'),
        (3, 'foo3', '19790519', null, 'bar3');

- Theзапрос будет генерировать один JSON на строку:

SELECT t.*
      ,TheRowAsJson
FROM @mockupTable t
CROSS APPLY (SELECT t.* FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) A(TheRowAsJson);

Результат

Id  Foo     Day         Bool    Bar     TheRowAsJson
1   foo1    1977-05-19  1       NULL    {"Id":1,"Foo":"foo1","Day":"1977-05-19","Bool":true}
2   foo2    1978-05-19  0       bar2    {"Id":2,"Foo":"foo2","Day":"1978-05-19","Bool":false,"Bar":"bar2"}
3   foo3    1979-05-19  NULL    bar3    {"Id":3,"Foo":"foo3","Day":"1979-05-19","Bar":"bar3"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...