将结果转换为双重嵌套 JSON 格式
Convert result into doubly nested JSON format
我正在尝试将 SQL 服务器结果转换为双重嵌套 JSON 格式。
源SQL服务器table:
ID
Name
Program
Type
Section
Director
Project
Sr Manager
PCM
Contractor
Cost Client
123
abc
qew
tyu
dd
ghghjg
hkhjk
fghfgf
gnhghj
gghgh
gghhg
456
yui
gdffgf
ghgf
jkjlkll
uiop
rtyuui
rfv
ujmk
rfvtg
efgg
转换为双 JSON,如下所示:
[
[
{"key":"ID","value":"123"},
{"key":"Name","value":"abc"},
{"key":"Program","value":"qew"},
{"key":"Type","value":"tyu"},
{"key":"Section","value":"dd"},
{"key":"Director","value":"ghghjg"},
{"key":"Project","value":"hkhjk"},
{"key":"Sr Manager","value":"fghfgf"},
{"key":"PCM","value":"gnhghj"},
{"key":"Contractor","value":"gghgh"},
{"key":"Cost Client","value":"gghhg"}
],
[
{"key":"ID","value":"456"},
{"key":"Name","value":"yui"},
{"key":"Program","value":"gdffgf"},
{"key":"Type","value":"ghgfjhjhj"},
{"key":"Section","value":"jkjlkll"},
{"key":"Director","value":"uiop"},
{"key":"Project","value":"rtyuui"},
{"key":"Sr Manager","value":"rfv"},
{"key":"PCM","value":"ujmk"},
{"key":"Contractor","value":"rfvtg"},
{"key":"Cost Client","value":"efgg"}
]
]
如有任何帮助,我们将不胜感激。
编辑:
我从重写“FOR JSON AUTO”开始,这样我就可以以某种方式添加“Key”“Value”文本。
但是因为我的 table 在列名中有 space,FOR XML PATH('') 根据 FOR XML 错误的要求给出了无效的 XML 标识符。
那是我想到寻求社区帮助的时候。
Create PROCEDURE [dbo].[GetSQLtoJSON] @TableName VARCHAR(255)
AS
BEGIN
IF OBJECT_ID(@TableName) IS NULL
BEGIN
SELECT Json = '';
RETURN
END;
DECLARE @SQL NVARCHAR(MAX) = N'SELECT * INTO ##T ' +
'FROM ' + @TableName;
EXECUTE SP_EXECUTESQL @SQL;
DECLARE @X NVARCHAR(MAX) = '[' + (SELECT * FROM ##T FOR XML PATH('')) + ']';
SELECT @X = REPLACE(@X, '<' + Name + '>',
CASE WHEN ROW_NUMBER() OVER(ORDER BY Column_ID) = 1 THEN '{'
ELSE '' END + Name + ':'),
@X = REPLACE(@X, '</' + Name + '>', ','),
@X = REPLACE(@X, ',{', '}, {'),
@X = REPLACE(@X, ',]', '}]')
FROM sys.columns
WHERE [Object_ID] = OBJECT_ID(@TableName)
ORDER BY Column_ID;
DROP TABLE ##T;
SELECT Json = @X;
END
示例数据:
CREATE TABLE [dbo].[Test1](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Col1] [int] NOT NULL,
[Col 2] varchar(50)
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Test1] ON
GO
INSERT [dbo].[Test1] ([ID], [Col1], [Col 2]) VALUES (1, 0,'ABCD')
GO
INSERT [dbo].[Test1] ([ID], [Col1] ,[Col 2]) VALUES (2, 1, 'POIU')
GO
SET IDENTITY_INSERT [dbo].[Test1] OFF
GO
首先检查这个link你可以找到你想要的
format-query-results-as-json-with-for-json-sql-server
但在你的情况下你可以试试这个
SELECT
ID,Name,Program,Type,Section,
Director,Project,Sr,Manager,PCM,Contractor,Cost,Client
FROM table
FOR JSON AUTO;
检查 link 有更多示例,因此它可以帮助您
您可以使用以下代码:
- 在
APPLY
中,将列反透视为 key/value 对...
- ... 并使用
FOR JSON PATH
进行聚合
- 使用
STRING_AGG
进行另一次聚合。
SELECT '[' + STRING_AGG(CAST(v.json AS nvarchar(max)), ',') + ']'
FROM T
CROSS APPLY (
SELECT *
FROM (VALUES
('ID', CAST(ID AS nvarchar(100))),
('Name', Name),
('Program', Program),
('Type', [Type]),
('Section', Section),
('Director', Director),
('Project', Project),
('Sr Manager', [Sr Manager]),
('PCM', PCM),
('Contractor', Contractor),
('Cost Client', [Cost Client])
) v([key], value)
FOR JSON PATH
) v(json)
您不能再次使用 FOR JSON
,因为那样您将得到 ["json": [{"key" : ...
我正在尝试将 SQL 服务器结果转换为双重嵌套 JSON 格式。
源SQL服务器table:
ID | Name | Program | Type | Section | Director | Project | Sr Manager | PCM | Contractor | Cost Client |
---|---|---|---|---|---|---|---|---|---|---|
123 | abc | qew | tyu | dd | ghghjg | hkhjk | fghfgf | gnhghj | gghgh | gghhg |
456 | yui | gdffgf | ghgf | jkjlkll | uiop | rtyuui | rfv | ujmk | rfvtg | efgg |
转换为双 JSON,如下所示:
[
[
{"key":"ID","value":"123"},
{"key":"Name","value":"abc"},
{"key":"Program","value":"qew"},
{"key":"Type","value":"tyu"},
{"key":"Section","value":"dd"},
{"key":"Director","value":"ghghjg"},
{"key":"Project","value":"hkhjk"},
{"key":"Sr Manager","value":"fghfgf"},
{"key":"PCM","value":"gnhghj"},
{"key":"Contractor","value":"gghgh"},
{"key":"Cost Client","value":"gghhg"}
],
[
{"key":"ID","value":"456"},
{"key":"Name","value":"yui"},
{"key":"Program","value":"gdffgf"},
{"key":"Type","value":"ghgfjhjhj"},
{"key":"Section","value":"jkjlkll"},
{"key":"Director","value":"uiop"},
{"key":"Project","value":"rtyuui"},
{"key":"Sr Manager","value":"rfv"},
{"key":"PCM","value":"ujmk"},
{"key":"Contractor","value":"rfvtg"},
{"key":"Cost Client","value":"efgg"}
]
]
如有任何帮助,我们将不胜感激。
编辑: 我从重写“FOR JSON AUTO”开始,这样我就可以以某种方式添加“Key”“Value”文本。 但是因为我的 table 在列名中有 space,FOR XML PATH('') 根据 FOR XML 错误的要求给出了无效的 XML 标识符。 那是我想到寻求社区帮助的时候。
Create PROCEDURE [dbo].[GetSQLtoJSON] @TableName VARCHAR(255)
AS
BEGIN
IF OBJECT_ID(@TableName) IS NULL
BEGIN
SELECT Json = '';
RETURN
END;
DECLARE @SQL NVARCHAR(MAX) = N'SELECT * INTO ##T ' +
'FROM ' + @TableName;
EXECUTE SP_EXECUTESQL @SQL;
DECLARE @X NVARCHAR(MAX) = '[' + (SELECT * FROM ##T FOR XML PATH('')) + ']';
SELECT @X = REPLACE(@X, '<' + Name + '>',
CASE WHEN ROW_NUMBER() OVER(ORDER BY Column_ID) = 1 THEN '{'
ELSE '' END + Name + ':'),
@X = REPLACE(@X, '</' + Name + '>', ','),
@X = REPLACE(@X, ',{', '}, {'),
@X = REPLACE(@X, ',]', '}]')
FROM sys.columns
WHERE [Object_ID] = OBJECT_ID(@TableName)
ORDER BY Column_ID;
DROP TABLE ##T;
SELECT Json = @X;
END
示例数据:
CREATE TABLE [dbo].[Test1](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Col1] [int] NOT NULL,
[Col 2] varchar(50)
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Test1] ON
GO
INSERT [dbo].[Test1] ([ID], [Col1], [Col 2]) VALUES (1, 0,'ABCD')
GO
INSERT [dbo].[Test1] ([ID], [Col1] ,[Col 2]) VALUES (2, 1, 'POIU')
GO
SET IDENTITY_INSERT [dbo].[Test1] OFF
GO
首先检查这个link你可以找到你想要的
format-query-results-as-json-with-for-json-sql-server
但在你的情况下你可以试试这个
SELECT
ID,Name,Program,Type,Section,
Director,Project,Sr,Manager,PCM,Contractor,Cost,Client
FROM table
FOR JSON AUTO;
检查 link 有更多示例,因此它可以帮助您
您可以使用以下代码:
- 在
APPLY
中,将列反透视为 key/value 对... - ... 并使用
FOR JSON PATH
进行聚合
- 使用
STRING_AGG
进行另一次聚合。
SELECT '[' + STRING_AGG(CAST(v.json AS nvarchar(max)), ',') + ']'
FROM T
CROSS APPLY (
SELECT *
FROM (VALUES
('ID', CAST(ID AS nvarchar(100))),
('Name', Name),
('Program', Program),
('Type', [Type]),
('Section', Section),
('Director', Director),
('Project', Project),
('Sr Manager', [Sr Manager]),
('PCM', PCM),
('Contractor', Contractor),
('Cost Client', [Cost Client])
) v([key], value)
FOR JSON PATH
) v(json)
您不能再次使用 FOR JSON
,因为那样您将得到 ["json": [{"key" : ...