我使用 Server 2017,并希望以JSON形式将许多记录发送到外部web服务。我不希望对json表单中的每一行重复列名。
为了减少输出JSON的大小,我希望将所有列名称放在第一行,并将只是列值放到另一行。
我想为我的输出json创建以下结构:
{
"data": [
["col1name", "col2name", "col3name"],
["value1", "value2", "value3"],
["value1", "value2", "value3"]
]
}
这种json格式在杰森林特上是有效的并且是Valiated的。
我想在sql server中创建这个结构,但我不知道如何创建?对此有什么想法吗?
发布于 2019-02-23 09:40:30
讽刺的是,我认为唯一能做到这一点的方法就是用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
做这件事的方法,但我不确定你能做到,不玩一些游戏。
https://stackoverflow.com/questions/54843735
复制相似问题