2016-05-28 10 views
5

Chciałbym uzyskać JSON z tablicą liczb całkowitych za pomocą funkcji SQL Server 2016's For JSON. Jestem zakłopotany na tablicy liczb całkowitych.Serwer SQL Server 2016 dla tablicy liczb całkowitych JSON

struktury tabeli bazy danych:

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) 

pożądanych rezultatów:

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

To jest najbliżej stałam, ale nie całkiem to, czego chcę.

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

powraca:

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

Czy należy udostępnić kod produkcyjnym, wystarczy dać więcej odpowiedzi – Arulkumar

+0

creat view/wynikowego użyciem permID a następnie uzyskać wynik zrobione http://stackoverflow.com/questions/10461874/sql-server-concatenate-group-by –

+0

@Arulkumar - dodał mój najbliższy kod. –

Odpowiedz

2

Można użyć FOR XML PATH i STUFF aby PermissionID jeden ciąg oddzielonych przecinkami dla każdego Employee użyć QUOTENANE na nim, a następnie umieścić wszystko w zmiennej i zastąpić "[ z [ i ]" z ]:

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 

wyjściowa:

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

EDIT:

Innym sposobem:

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

wyjściowa:

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

Zamknij, chociaż chcę mieć tablicę liczb, na przykład:" Uprawnienia ": [1,2,3] –

+0

Co powiesz na to (sprawdź edycję do mojej odpowiedzi) – gofr1

+0

To jest właściwe wyjście, ale nie chcę ściśle stosować technik łączenia ciągów. Część tablicy może używać trików, ale zapytanie zewnętrzne (które w tym przypadku jest uproszczone) musi korzystać z funkcji "For JSON". –

5

W AdventureWorks 2016 CTp3 JSON próbki można znaleźć funkcję, która może wyczyścić tablicę klucza: wartość pa IRS i tworzenia tablic wartości 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 

Wystarczy podać wynik Twój wyselekcjonowania ekspresji JSON jako parametr @json i nazwę klucza, który chcesz usunąć jako drugi parametr. Prawdopodobnie coś jak:

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') 
Powiązane problemy