2013-09-04 23 views
8

Jeśli masz prosty stół jak:Jak stworzyć JSON z tabeli EAV w SQL Server

Id Name Age 
1 Saeed 32 
2 John 28 
3 David 34 

Następnie można utworzyć JSON przy użyciu For XML w SQL Server prostu lubię:

select '{ name : "' + Name + '", age : ' + age + ' }' 
from People 
where Id = 1 
for xml path('') 

Jest to łatwe, ponieważ kolumny są znane wcześniej. Jednak utknąłem w tworzeniu JSON ze stołu EAV. Na przykład, jeśli tabela jest:

Id EntityId Key Value 
1 1  Name Saeed 
2 1  Age 32 
3 1  Gender Male 
4 1  Key1 Value1 
5 1  Key2 Value2 

Jak mogę utworzyć ten JSON?

{ Name: "Saeed", Age: 32, Gender: "Male", Key1: "Value1", Key2: "Value2" } 

Od tego zapytania:

select * 
from PeopleEav 
where EntityId = 1 

Należy pamiętać, że liczba przycisków jest zmienna (jest to tabela EAV).

+3

Formatowanie wyświetlania nie należy do zaplecza. Zrób to w kliencie. –

+1

Dzięki za te cenne informacje drogie @RemusRusanu. Czasem zasady akademickie nie są w akcji;) –

+0

Kilka osób przyłączyło się do tego z procedurami przechowywanymi, takimi jak [to] (http://firozansari.com/2008/11/21/generating-json-from-tsql-query/) i [to] (http://stackoverflow.com/a/15442030/864696). –

Odpowiedz

5

Spróbuj jeden -

DECLARE @PeopleEav TABLE 
(
     Id INT IDENTITY(1,1) 
    , EntityId INT 
    , [Key] VARCHAR(30) 
    , Value VARCHAR(100) 
) 

INSERT INTO @PeopleEav (EntityId, [Key], Value) 
VALUES 
    (1, 'Name', 'Saeed'), 
    (1, 'Age', '32'), 
    (1, 'Gender', 'Male'), 
    (1, 'Key1', 'Value1'), 
    (1, 'Key2', 'Value2') 

SELECT 
     t.EntityId 
    , JSON = STUFF((
     SELECT ', ' + [Key] + ': "' + Value + '"' 
     FROM @PeopleEav t2 
     WHERE t2.EntityId = t2.EntityId 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '{ ') + ' }'     
FROM (
    SELECT DISTINCT EntityId 
    FROM @PeopleEav 
) t 
--WHERE EntityId = 1 

Wyjście -

EntityId JSON 
----------- -------------------------------------------------------------------------------------------- 
1   { Name: "Saeed", Age: "32", Gender: "Male", Key1: "Value1", Key2: "Value2" } 
1

Jeśli masz SQL Server 2016 można użyć FOR JSON. Możesz także użyć istniejących bibliotek CLR, takich jak JsonSelect lub Json4Sql.

Powiązane problemy