将 rows/table 条记录转换为 sql 服务器中的 json 文档
convert rows/table records to json document in sql server
以下是输入的样本数据
if object_id('tempdb.dbo.#store_data') is not null
drop table #store_data
create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100)
)
INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');
select * from #store_data
以下是要求的结果
[{
"sid"="1",
"bid"="3",
"time"="2019-01-01"
"que"="apple"},
{"sid"="2",
"bid"="5",
"hrs"="6",
"dat"="pine"
}]
以下是我试过的查询
select [key],[value] from #store_data for json path
没有达到预期效果。
试试这个:
drop table if exists #store_data;
create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100)
)
INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');
DECLARE @DynamicTSQLStatement NVARCHAR(MAX)
,@ColumnNames NVARCHAR(MAX);
SELECT @ColumnNames = STUFF
(
(
SELECT DISTINCT ',[' + [key] + ']'
FROM #store_data
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynamicTSQLStatement = N'
select ' + @ColumnNames + '
from #store_data
PIVOT
(
MAX([value]) FOR [key] IN (' + @ColumnNames + ')
) PVT
FOR JSON PATH;
';
EXEC sp_executesql @DynamicTSQLStatement;
更改为 SELECT *
以便在 JSON 对象中也获得 storeid
。此外,在 SQL Server 2017 中,您可以使用 STRING_AGG 连接键。
请注意,您无法直接查询,您必须先在 storeid
上 PIVOT
。
您可以尝试以下查询。
select sid, bid, time,que, hrs,dat
from #store_data src
pivot
(
MAX([value])
for [key] in (sid, bid, time,que, hrs,dat)
) piv
for json auto
完整示例
if object_id('tempdb.dbo.#store_data') is not null
drop table #store_data
create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100))
INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');
select sid, bid, time,que, hrs,dat
from #store_data src
pivot
(
MAX([value])
for [key] in (sid, bid, time,que, hrs,dat)
) piv
for json auto
输出:
[
{
"sid": "1",
"bid": "3",
"time": "2019-01-01",
"que": "apple"
},
{
"sid": "2",
"bid": "5",
"hrs": "6",
"dat": "pine"
}
]
在线演示:
编辑:
PIVOT
在 stroeid
ASC
上自动排序,无需指定任何顺序。如果您想将其更改为不同的顺序,比如 DESC stroeid
,在这种情况下,您可以按以下方式更改查询。
select sid, bid, time,que, hrs,dat
from #store_data src
pivot
(
MAX([value])
for [key] in (sid, bid, time,que, hrs,dat)
) piv
order by storeid desc
for json auto
以下是输入的样本数据
if object_id('tempdb.dbo.#store_data') is not null
drop table #store_data
create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100)
)
INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');
select * from #store_data
以下是要求的结果
[{
"sid"="1",
"bid"="3",
"time"="2019-01-01"
"que"="apple"},
{"sid"="2",
"bid"="5",
"hrs"="6",
"dat"="pine"
}]
以下是我试过的查询
select [key],[value] from #store_data for json path
没有达到预期效果。
试试这个:
drop table if exists #store_data;
create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100)
)
INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');
DECLARE @DynamicTSQLStatement NVARCHAR(MAX)
,@ColumnNames NVARCHAR(MAX);
SELECT @ColumnNames = STUFF
(
(
SELECT DISTINCT ',[' + [key] + ']'
FROM #store_data
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynamicTSQLStatement = N'
select ' + @ColumnNames + '
from #store_data
PIVOT
(
MAX([value]) FOR [key] IN (' + @ColumnNames + ')
) PVT
FOR JSON PATH;
';
EXEC sp_executesql @DynamicTSQLStatement;
更改为 SELECT *
以便在 JSON 对象中也获得 storeid
。此外,在 SQL Server 2017 中,您可以使用 STRING_AGG 连接键。
请注意,您无法直接查询,您必须先在 storeid
上 PIVOT
。
您可以尝试以下查询。
select sid, bid, time,que, hrs,dat
from #store_data src
pivot
(
MAX([value])
for [key] in (sid, bid, time,que, hrs,dat)
) piv
for json auto
完整示例
if object_id('tempdb.dbo.#store_data') is not null
drop table #store_data
create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100))
INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');
select sid, bid, time,que, hrs,dat
from #store_data src
pivot
(
MAX([value])
for [key] in (sid, bid, time,que, hrs,dat)
) piv
for json auto
输出:
[
{
"sid": "1",
"bid": "3",
"time": "2019-01-01",
"que": "apple"
},
{
"sid": "2",
"bid": "5",
"hrs": "6",
"dat": "pine"
}
]
在线演示:
编辑:
PIVOT
在 stroeid
ASC
上自动排序,无需指定任何顺序。如果您想将其更改为不同的顺序,比如 DESC stroeid
,在这种情况下,您可以按以下方式更改查询。
select sid, bid, time,que, hrs,dat
from #store_data src
pivot
(
MAX([value])
for [key] in (sid, bid, time,que, hrs,dat)
) piv
order by storeid desc
for json auto