arrays - 用于 JSON 输出整数数组的 SQL Server 2016

标签 arrays sql-server json sql-server-2016

我想使用 SQL Server 2016 的 For JSON 获取带有整数数组的 JSON特征。我被整数数组难住了。
数据库表结构:

declare @Employees table (ID int, Name nvarchar(50))
insert into @Employees values
(1, 'Bob'),
(2, 'Randy')

declare @Permissions table (ID int, PermissionName nvarchar(50))
insert into @Permissions values
(1, 'Post'),
(2, 'Comment'),
(3, 'Edit'),
(4, 'Delete')

declare @EmployeePermissions table (EmployeeID int, PermissionID int)
insert into @EmployeePermissions values
(1, 1),
(1, 2),
(2, 1),
(2, 2),
(2, 3)
预期结果:
{"EmployeePermissions": [
  {"Employee":"Bob", "Permissions":[1,2]},
  {"Employee":"Randy", "Permissions":[1,2,3]}
]}
这是我得到的最接近的,但不是我想要的。
select
    e.Name as Employee,
    (select 
         convert(nvarchar(10),ep.PermissionID) as PermID 
     from @EmployeePermissions ep 
     where ep.EmployeeID=e.ID 
     for json path) as 'Permissions'
from
    @Employees e
for json path, root('EmployeePermissions')
返回:
{"EmployeePermissions": [
  {"Employee":"Bob", "Permissions":[{"permID":1},{"permID":2}]},
  {"Employee":"Randy", "Permissions":[{"permID":1},{"permID":2},{"permID":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')

关于arrays - 用于 JSON 输出整数数组的 SQL Server 2016,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494211/

相关文章:

arrays - 如何在 Swift 中打乱数组?

SQL - 获取 View 每行上不同值的平均值

javascript - 谷歌图表 "Table has no columns"

json - 如何根据搜索查询从stackoverflow API 获取问题列表?

c# - 从代码运行时存储过程超时,而不是从查询工具运行

java - 以 json 格式向客户端返回消息以及数据 - Java/Spring/REST

php - 在 PHP 中使用数组创建 HashMap

c - 文件范围内可变修改的数组

c++ - 在一维数组中索引不规则网格 X、Y、Z 坐标

c# - Entity Framework 和动态模式