Специальный формат вывода Json - PullRequest
0 голосов
/ 23 февраля 2019

Я использую SQL Server 2017 и хочу отправить много записей во внешний веб-сервис в форме JSON .Я не хочу повторять имя столбца для каждой строки в форме json.
К уменьшить размер выходного JSON, я хочу поместить все имя столбца в первую строку и поместить только значения столбцов в другие строки.
Я хочу создать структуру ниже для моего вывода json :

  {
    "data": [
        ["col1name", "col2name", "col3name"],
        ["value1", "value2", "value3"],
        ["value1", "value2", "value3"]
    ]
}

Этот формат json действителен и проверен на jsonlint
Я хочу создать эту структуру на сервере SQL, но я не знаю, КАК?Есть ли какие-либо идеи по этому поводу?

1 Ответ

0 голосов
/ 23 февраля 2019

По иронии судьбы, единственный способ, которым я могу думать, это сделать с помощью FOR XML PATH:

CREATE TABLE V (Col1 varchar(10), Col2 varchar(10),Col3 varchar(10));
INSERT INTO V    
SELECT *
FROM (VALUES('value1','value2','value3'),
            ('value1','value2','value3')) V(Col1, Col2, Col3);

DECLARE @JSON nvarchar(MAX);

SET @JSON = N'{' + NCHAR(13) + NCHAR(10) +
            N'   "data": [' + NCHAR(13) + NCHAR(10) +
            N'       [' + STUFF((SELECT N', ' + QUOTENAME(c.[name],'"')
                                 FROM sys.columns c
                                      JOIN sys.tables t ON c.object_id = t.object_id
                                 WHERE t.[name] = N'V'
                                 ORDER BY c.column_id ASC
                                 FOR XML PATH(N''),TYPE).value('.', 'varchar(MAX)'),1,2,N'') + N'],' + NCHAR(13) + NCHAR(10) +
            STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) +
                          N'       [' + QUOTENAME(Col1,'"') + N', ' + QUOTENAME(Col2,'"') + N', ' + QUOTENAME(Col3,'"') + N']'
                   FROM V
                   ORDER BY V.Col1
                   FOR XML PATH(N''),TYPE).value('.', 'varchar(MAX)'),1,3,N'') + NCHAR(13) + NCHAR(10) +
            N'    ]' + NCHAR(13) + NCHAR(10) +
            N'}';

PRINT @JSON;

DROP TABLE V;

db <> fiddle

Кто-то может знатьспособ сделать это с FOR JSON;но я не уверен, что ты сможешь без игры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...