在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"}] 

但是,我无法达到我的预期的输出。任何人都建议我实现这个输出。

+0

你可以看看这个链接https://www.red-gate.com/simple-talk/sql/t-sql-programming/producing-json-documents-from-sql-server- queries-via-tsql/ – EricZ

+0

最早支持的SQL Server版本是2012.JSon支持是在2016年添加的。*为什么*您是否试图在服务器上生成JSON,只是不知道它的版本?为什么不在客户端上构建Json字符串? –

+0

您可能还想重新考虑表格的设计。属性表实际上是一个*反模式*。你不能指定正确的类型,你不能设置约束,不能为它们编制索引。如果你想让同一个表存储许多不同类型的对象,只需添加额外的列。您也可以使用稀疏列来*避免*浪费存储未使用的字段。或者使用XML字段 –

不幸的是,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