在SQL Server 2008中用一列生成JSON结果组的T-SQL选择查询
问题描述:
在这里,我有一种情况是通过SQL Server 2008 R2中一个表的特定窗口将值导入到JSON组中。在SQL Server 2008中用一列生成JSON结果组的T-SQL选择查询
考虑tablename是测试,
---------------------------
Id Value Data
---------------------------
1 Value1 Data1
2 Value2 Data2
2 Value3 Data3
2 Value4 Data4
3 Value5 Data5
3 Value6 Data6
---------------------------
我的输出应该如下,
------------------------------------------------------------------------------
Id ValueDatas
------------------------------------------------------------------------------
1 [{"Value" : "Value1", "Data" : "Data1"}]
2 [{"Value" : "Value2", "Data" : "Data2"}, {"Value" : "Value3", "Data" :
"Data3"}, {"Value" : "Value4", "Data" : "Data4"}]
3 [{"Value" : "Value5", "Data" : "Data5"}, {"Value" : "Value6", "Data" :
"Data6"}]
------------------------------------------------------------------------------
编辑: 我试过下面的查询来获得输出,但它不起作用。上述查询的
SELECT Id, '[' + STUFF((SELECT ',{"Value":"' + Value +'"'+
+ ',"Data":"' + Data + '"}'
FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') + ']' AS ValueDatas
FROM @TABLE
Group by Id, Value, Data
输出是,
----------------------------------------
Id ValueDatas
----------------------------------------
1 [{"Value":"Value1","Data":"Data1"}]
2 [{"Value":"Value2","Data":"Data2"}]
2 [{"Value":"Value3","Data":"Data3"}]
2 [{"Value":"Value4","Data":"Data4"}]
3 [{"Value":"Value5","Data":"Data5"}]
3 [{"Value":"Value6","Data":"Data6"}]
但是,我无法达到我的预期的输出。任何人都建议我实现这个输出。
答
不幸的是,SQL Server 2008不支持JSON特性,这可能是一些解决方法。然而,您可能会在SQL Server 2016使用下面的查询与兼容级别130
ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 130
SELECT Id,Value,Data FROM
FOR JSON AUTO
欲了解更多信息,请参阅下面的文章 - https://docs.microsoft.com/en-us/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server
+0
谢谢@piyush的回复。我不想更改我的兼容级别。我已经通过使用STUFF作为我的等级更新了我试过的查询。你也可以检查一样的尝试。 – cgsabari
答
你接近。这是一个示例脚本,可为您提供所需的输出。
DECLARE @tt TABLE(Id INT, Value NVARCHAR(256), Data NVARCHAR(256));
INSERT INTO @tt(Id,Value,Data)
VALUES
(1,N'Value1',N'Data1'),
(2,N'Value2',N'Data2'),
(2,N'Value3',N'Data3'),
(2,N'Value4',N'Data4'),
(3,N'Value5',N'Data5'),
(3,N'Value6',N'Data6');
SELECT
t_o.Id,
ValueDatas='['+STUFF((
SELECT
', {"Value" : "'+ Value +'", "Data" : "' + Data + '"}'
FROM
@tt AS t_i
WHERE
t_i.Id=t_o.Id
FOR XML
PATH(''), TYPE
).value('.[1]','NVARCHAR(MAX)'),1,2,'')+']'
FROM
@tt AS t_o
GROUP BY
t_o.Id
你可以看看这个链接https://www.red-gate.com/simple-talk/sql/t-sql-programming/producing-json-documents-from-sql-server- queries-via-tsql/ – EricZ
最早支持的SQL Server版本是2012.JSon支持是在2016年添加的。*为什么*您是否试图在服务器上生成JSON,只是不知道它的版本?为什么不在客户端上构建Json字符串? –
您可能还想重新考虑表格的设计。属性表实际上是一个*反模式*。你不能指定正确的类型,你不能设置约束,不能为它们编制索引。如果你想让同一个表存储许多不同类型的对象,只需添加额外的列。您也可以使用稀疏列来*避免*浪费存储未使用的字段。或者使用XML字段 –