SQL服务器在嵌套的JSON数据结构中获取数据

时间:2017-02-14 21:09:33

标签: sql-server json reporting-services sql-server-2016 sqlreportingservice

我有嵌套的JSON文件,我试图将其用作报告的数据源。我是"扁平化"结构,但不知道如何评估兄弟姐妹的数据。

示例数据:

{
"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:提取数据文件并展平报告数据:

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]

我偶然发现如何从学生那里获取所有学生数据"进入"学生ID"通过身份证加入。

1 个答案:

答案 0 :(得分:0)

我创建了临时表,将json数据导入其中,这允许我拥有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