2016-05-28 46 views
5

Mi piacerebbe ottenere JSON con un array di numeri interi utilizzando la funzionalità For JSON di SQL Server 2016. Sono perplesso sulla matrice di numeri interi.SQL Server 2016 per matrice di interi in uscita JSON

strutture delle tabelle del database:

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) 

risultati desiderati:

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

Questo è il più vicino che ho ottenuto, ma non del tutto quello che voglio.

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') 

rendimenti:

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

ti invitiamo a condividere il codice di lavoro, lo farà aiuta a dare più risposte – Arulkumar

+0

creat una vista/gruppo di risultati utilizzando per permID e quindi ottenere il risultato fatto http://stackoverflow.com/questions/10461874/sql-server-concatenate-group-by –

+0

@Arulkumar - ha aggiunto il mio codice più vicino. –

risposta

2

È possibile utilizzare FOR XML PATH e STUFF per rendere PermissionID una stringa separati da virgola per ogni Employee, utilizzare QUOTENANE su di essa, poi mettere il tutto in variabili e sostituire "[ con [ e ]" con ]:

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 

uscita:

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

EDIT:

Un altro modo:

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,'') + ']}' 

uscita:

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

Chiudi, anche se sto volendo una serie di numeri, come questo:" Permessi ": [1,2,3] –

+0

Che ne dici di questo (controlla la modifica alla mia risposta) – gofr1

+0

Questo è l'output corretto, ma non sto volendo tecniche di concatenazione di stringhe rigorosamente. La parte dell'array può utilizzare trucchi stringa, ma la query esterna (che in questo caso è semplificata) deve utilizzare la funzione "Per JSON". –

5

In AdventureWorks 2016 CTP3 campione JSON è possibile trovare una funzione che può pulire array di chiavi: valore pa irs e creare matrice od valori:

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 

Basta fornire risultato del vostro SELECT PER espressione JSON come parametro di @json e il nome della chiave che si desidera rimuovere come secondo parametro. Probabilmente qualcosa di simile:

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')