0

J'ai un fichier JSON imbriqué que j'essaie d'utiliser comme source de données pour les rapports. Je suis en train de "aplatir" la structure, mais je ne sais pas comment évaluer les données sur les frères et soeurs.Le serveur SQL obtient des données dans la structure de données JSON imbriquée

données Exemple:

{ 
"Cources": [{ 
     "ID": 1, 
     "Name": "MAC100", 
     "Room": 100, 
     "TAID": 123, 
     "StudentsIDs": [ 
      1, 2 
     ] 
    } 
], 

"TAs": [{ 
    "ID": 123, 
    "Name": "Joe", 
    "LName": "Smith" 
}], 

"Students": [{ 
    "ID": 1, 
    "LName": "Clark" 
}, { 
    "ID": 2, 
    "LName": "Peterson" 
}] 
} 

SQL Server: ingèrent fichier de données et aplatissez données pour le rapport:

SELECT Cource.ID, 
Cource.Name as CName, 
Cource.Room as CRoom, 
CourceStudents.LName 

FROM OPENROWSET (BULK 'C:\Data\file.json', SINGLE_CLOB) as jsonfile 

CROSS APPLY OPENJSON(BulkColumn,'$[0]') WITH( 

    Cources nvarchar(max) AS JSON, 
    TAs nvarchar(max) AS JSON, 
    Students nvarchar(max) AS JSON 

    ) AS [SampleData] 

CROSS APPLY OPENJSON(Cources) WITH (
    Room integer, 
    Name nvarchar(max), 
    StudentsIDs nvarchar(max) AS JSON 
) as [Cources] 

CROSS APPLY OPENJSON(Students) WITH ( 
    ID integer, 
    LName nvarchar(max), 
) as [Students] 

CROSS APPLY OPENJSON(StudentsIDs) WITH ( 
**//??? how to get full data for the student from "Students" joining by the student ID ?** 
) as [CourceStudents] 

J'ai trébuché de la façon d'obtenir toutes les données relatives aux élèves de "étudiants" dans « StudentIDs "se joindre à l'ID.

+0

Que voulez-vous la sortie pour ressembler? Aussi, avoir une chaîne de nombres comme celle pour laquelle les étudiants sont dans ce que Cource n'est pas bonne. – dfundako

+0

Ces données ne sont pas stockées dans la base de données. J'utilise uniquement SQL Server pour générer des rapports à partir du flux de données de la vie. J'essaye d'aplatir la structure de JSON pour ressembler aux rangées d'une table avec toutes les informations, par exemple: Cources.ID, Students.ID, Students.LName – kaplievabell

Répondre

0

J'ai créé table temporaire, les données JSON importées dans ce qui me allowerd d'avoir clause WHERE:

DROP TABLE IF EXISTS tempdb.dbo.#temp; 
CREATE TABLE #temp (
InfoJson nvarchar(max) 
) 

ALTER TABLE #temp 
ADD CONSTRAINT [Content should be formatted as JSON] 
CHECK (ISJSON(InfoJson)> 0) 

Insert INTO #temp (InfoJson) 
SELECT * 
FROM OPENROWSET (BULK 'C:\Data\file.json', SINGLE_CLOB) as j; 

SELECT Cource.ID, 
Cource.Name as CName, 
Cource.Room as CRoom, 
CourceStudents.LName 
FROM #temp 

CROSS APPLY OPENJSON(InfoJson,'$') WITH( 
    Cources nvarchar(max) AS JSON, 
    TAs nvarchar(max) AS JSON, 
    Students nvarchar(max) AS JSON 
    ) AS [SampleData] 

CROSS APPLY OPENJSON(Cources) WITH (
    Room integer, 
    Name nvarchar(max), 
    StudentsIDs nvarchar(max) AS JSON 
) as [Cources] 

CROSS APPLY OPENJSON(StudentsIDs) WITH (
    value nvarchar(100) '$' 
) as [StudentsIDs] 

CROSS APPLY OPENJSON(Students) WITH ( 
    ID integer, 
    LName nvarchar(max), 
) as [Students] 

WHERE StudentsIDs.value=Students.ID