SQL Server 2016 for JSON output integer array

前端 未结 2 804
梦毁少年i
梦毁少年i 2020-12-06 17:06

I\'d like to get JSON with an array of integers using SQL Server 2016\'s For JSON feature. I\'m stumped on array of integers.

Database table structures:

相关标签:
2条回答
  • 2020-12-06 17:52

    In AdventureWorks 2016 CTP3 JSON sample you can find a function that can clean array of key:value pairs and create array od values:

    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
    

    Just provide result of your SELECT FOR JSON expression as @json parameter and name of the key that you want to remove as second parameter. Probably something like:

    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')
    
    0 讨论(0)
  • 2020-12-06 17:58

    You can use FOR XML PATH and STUFF to make PermissionID one string comma separated for each Employee, use QUOTENANE on it, then put all in variable and replace "[ with [ and ]" with ] :

    DECLARE @json NVARCHAR(max)
    
    SELECT @json = REPLACE(REPLACE((
        SELECT  e.Name as [Employee],
                QUOTENAME(STUFF((SELECT ','+CAST(ep.PermissionID as nvarchar(10))
                FROM EmployeePermissions ep
                WHERE e.ID = ep.EmployeeID
                FOR XML PATH('')),1,1,''))
                as [Permissions]
        FROM Employees e 
        FOR JSON AUTO, ROOT('EmployeePermissions')
    ),'"[','['),']"',']')
    
    SELECT @json
    

    Output:

    {"EmployeePermissions":[
        {"Employee":"Bob","Permissions":[1,2]},
        {"Employee":"Randy","Permissions":[1,2,3]}
    ]}
    

    EDIT:

    Another way:

    SELECT '{"EmployeePermissions":[' + STUFF((
    SELECT  ',{"Employee":"' + e.Name + '","Permissions":[' +
            STUFF((SELECT ',' + CAST(PermissionID as nvarchar(10))
            FROM EmployeePermissions ep
            WHERE ep.EmployeeID = e.ID
            FOR XML PATH('')),1,1,'') +']}'
    FROM Employees e
    FOR XML PATH('')),1,1,'') + ']}'
    

    Output:

    {"EmployeePermissions":[
        {"Employee":"Bob","Permissions":[1,2]},
        {"Employee":"Randy","Permissions":[1,2,3]}
    ]}
    
    0 讨论(0)
提交回复
热议问题