我使用 SQL Server 2017 ,并且我想以JSON格式将许多记录发送到外部Web服务。
我不想以json形式的每一行重复列名。
要减小输出JSON的大小,我想将所有列名放在第一行,并将正列值放到另一行。 />
我想为我的输出json 创建以下结构:
{
"data": [
["col1name", "col2name", "col3name"],
["value1", "value2", "value3"],
["value1", "value2", "value3"]
]
}
此json格式有效,并且已在jsonlint上生效
我想在sql server中创建此结构,但我不知道如何?
有什么想法吗?
答案 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;
有人可能知道使用FOR JSON
来做到这一点的方法;但是我不确定你可以没有一些游戏。