2013-09-04 13 views
8

Wenn Sie eine einfache Tabelle haben wie:Wie JSON aus einer EAV-Tabelle in SQL Server erstellen

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

Dann Sie eine JSON mit For XML in SQL Server erstellen können einfach:

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

Dies ist einfach, da die Spalten vorher bekannt sind. Ich stehe jedoch fest, JSON aus einer EAV-Tabelle zu erstellen. Zum Beispiel, wenn die Tabelle ist:

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

Wie kann ich dieses JSON erstellen?

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

Aus dieser Abfrage:

select * 
from PeopleEav 
where EntityId = 1 

Bitte beachten Sie, dass die Anzahl der Tasten variabel ist (es ist eine EAV-Tabelle).

+3

Die Formatierung der Anzeige gehört nicht zum Backend. Tun Sie es im Kunden. –

+1

Danke für diese wertvollen Informationen, liebe @RemusRusanu. Manchmal sind akademische Regeln nicht in Aktion;) –

+0

Ein paar Leute haben dies mit gespeicherten Prozeduren angeheftet, wie [dies] (http://firozansari.com/2008/11/21/generating-json-from-tsql-query/) und [dies] (http://stackoverflow.com/a/15442030/864696). –

Antwort

5

Versuchen Sie dieses -

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 

Ausgang -

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

Wenn Sie SQL Server 2016 haben Sie FOR JSON verwenden können. Sie können auch vorhandene CLR-Bibliotheken wie JsonSelect oder Json4Sql verwenden.

Verwandte Themen