Arrays SQL Server 2016用于JSON输出整数数组

Arrays SQL Server 2016用于JSON输出整数数组,arrays,sql-server,json,sql-server-2016,Arrays,Sql Server,Json,Sql Server 2016,我想使用SQLServer2016的For JSON功能获取包含整数数组的JSON。我被整数数组难住了 数据库表结构: 声明@Employees表ID int,名称nvarchar50 在@Employees值中插入 1“鲍勃”, 2,“兰迪” 声明@Permissions表ID int,PermissionName nvarchar50 在@Permissions值中插入 一,"岗位",, 二,"评论",, 3、‘编辑’, 4,“删除” 声明@EmployeePermissions表Emplo

我想使用SQLServer2016的For JSON功能获取包含整数数组的JSON。我被整数数组难住了

数据库表结构:

声明@Employees表ID int,名称nvarchar50 在@Employees值中插入 1“鲍勃”, 2,“兰迪” 声明@Permissions表ID int,PermissionName nvarchar50 在@Permissions值中插入 一,"岗位",, 二,"评论",, 3、‘编辑’, 4,“删除” 声明@EmployeePermissions表EmployeeID int,PermissionID int 在@EmployeePermissions值中插入 1, 1, 1, 2, 2, 1, 2, 2, 2, 3 预期结果:

{员工许可证:[ {雇员:Bob,权限:[1,2]}, {雇员:Randy,权限:[1,2,3]} ]} 这是我得到的最接近的,但不是我想要的

选择 e、 作为雇员的姓名, 选择 CONVERTNVARCAR10,ep.PermissionID作为PermID 来自@EmployeePermissions ep 其中ep.EmployeeID=e.ID 将json路径设置为“权限” 从…起 @雇员 对于json路径,根“EmployeePermissions” 返回:

{员工许可证:[ {Employee:Bob,权限:[{permID:1},{permID:2}]}, {Employee:Randy,权限:[{permID:1},{permID:2},{permID:3}]} ]} 您可以使用FOR XML PATH and STUFF为每个员工设置一个逗号分隔的PermissionID字符串,在其上使用引号,然后将所有内容放入变量中,并将[and]替换为[and]:

声明@json-NVARCHARmax 选择@json=replace 选择e.名称为[员工], QUOTENAMESTUFFSELECT','+CASTep.PermissionID作为nvarchar10 来自雇员许可证ep 其中e.ID=ep.EmployeeID 对于XML路径,1,1, 作为[权限] 来自雇员 对于JSON AUTO,根“EmployeePermissions” ,'[','[',']',']' 选择@json 输出:

{员工许可证:[ {雇员:Bob,权限:[1,2]}, {雇员:Randy,权限:[1,2,3]} ]} 编辑:

另一种方式:

选择“{EmployeePermissions:[]”+STUFF 选择“,{Employee:'+e.Name+”,权限:[”+ 填充选择“,”+CASTPermissionID为nvarchar10 来自雇员许可证ep 其中ep.EmployeeID=e.ID 对于XML路径,1,1,+']} 来自雇员 对于XML路径,1,1,+']} 输出:

{员工许可证:[ {雇员:Bob,权限:[1,2]}, {雇员:Randy,权限:[1,2,3]} ]}
在AdventureWorks 2016 CTP3 JSON示例中,您可以找到一个函数,该函数可以清除数组中的键:值对并创建数组od值:

DROP FUNCTION IF EXISTS dbo.ufnToRawJsonArray
GO
CREATE FUNCTION
[dbo].[ufnToRawJsonArray](@json nvarchar(max), @key nvarchar(400)) returns nvarchar(max)
AS BEGIN
       declare @new nvarchar(max) = replace(@json, CONCAT('},{"', @key,'":'),',')
       return '[' + substring(@new, 1 + (LEN(@key)+5), LEN(@new) -2 - (LEN(@key)+5)) + ']'
END
只需将SELECT FOR JSON表达式的结果作为@JSON参数提供,并将要删除的键的名称作为第二个参数提供。可能是这样的:

select
e.Name as Employee,
JSON_QUERY(dbo.ufnToRawJsonArray(
    (select 
     convert(nvarchar(10),ep.PermissionID) as PermID 
     from @EmployeePermissions ep 
     where ep.EmployeeID=e.ID 
     for json path)
  , 'PermID'))
   as 'Permissions'
from
@Employees e
for json path, root('EmployeePermissions')

您能否分享工作代码,这将有助于提供更多答案使用permID创建视图/结果集,然后在@Arulkumar完成结果-添加了我最接近的代码。如果您可以接受SQL Server有问题的输出,我建议您让消费者知道这些别名。如果您使用的是Json.NET,那么您会看到这个极好的答案:Close,尽管我想要一个数字数组,比如:Permissions:[1,2,3]好吧,也许在下一版本的SQL Server中,他们添加了这样的功能:您可以在不命名列的情况下调用Json PATH,或者以Json_MODIFY append这样的方式创建值数组。但就目前而言,一切都是这样。希望你能找到你问题的答案谢谢你。在等待微软支持JSON这么久之后,我发现自己已经达到了极限,这让我很难接受。@JensFrandsen是的,我很失望,我似乎不知道如何用我的数据创建一个简单的数组数组。我不要钥匙,有什么消息吗?目前,我只是在解析应用程序中的JSON输出后立即删除键