特殊的Json输出格式

时间:2019-02-23 16:42:04

标签: sql sql-server database

我使用 SQL Server 2017 ,并且我想以JSON格式将许多记录发送到外部Web服务。 我不想以json形式的每一行重复列名。
减小输出JSON的大小,我想将所有列名放在第一行,并将正列值放到另一行。 /> 我想为我的输出json 创建以下结构:

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

此json格式有效,并且已在jsonlint上生效
我想在sql server中创建此结构,但我不知道如何? 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

具有讽刺意味的是,我唯一想到的方法是使用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来做到这一点的方法;但是我不确定你可以没有一些游戏。