Возвращать сведения о сотрудниках каждого сотрудника в виде массива JSON с каждым сотрудником в SQL Server - PullRequest
1 голос
/ 25 октября 2019

Я хочу вернуть результат запроса в виде объекта JSON с сервера SQL. У меня ниже таблицы Employee и EmployeeDtl.

DROP TABLE IF EXISTS #Employee
CREATE TABLE #Employee (EmpId bigint, EmpName varchar(2000))

INSERT INTO #Employee VALUES (1, 'A')

DROP TABLE IF EXISTS #EmployeeDtl
CREATE TABLE #EmployeeDtl (EmpId bigint, WorkObject varchar(100), LocationName varchar(100))

INSERT INTO #EmployeeDtl VALUES (1, 'AAA', 'AAAAA')
INSERT INTO #EmployeeDtl VALUES (1, 'BBB', 'BBBB')
INSERT INTO #EmployeeDtl VALUES (1, 'CCC', 'CCCC')

Я хочу вернуть данные в следующем формате.

{
    "Employees": [{
        "EmpId": 1,
        "EmpName": "A",
        "EmpDtl": [{
                "WorkObject": "AAA",
                "LocationName": "AAAAA"
            },
            {
                "WorkObject": "BBB",
                "LocationName": "BBBB"
            },
            {
                "WorkObject": "CCC",
                "LocationName": "CCCC"
            }
        ]
    }]
}

Я написал следующий запрос.

SELECT 
    E.EmpId, E.EmpName, ED.WorkObject AS [EmpDtl.WorkObject], ED.LocationName AS [EmpDtl.LocationName]
FROM
    #Employee E 
    INNER JOIN #EmployeeDtl ED ON E.EmpId = ED.EmpId
FOR
    JSON PATH, ROOT('Employees')

Но вышеприведенный запрос возвращает данные в следующем формате.

{
    "Employees": [{
        "EmpId": 1,
        "EmpName": "A",
        "EmpDtl": {
            "WorkObject": "AAA",
            "LocationName": "AAAAA"
        }
    }, {
        "EmpId": 1,
        "EmpName": "A",
        "EmpDtl": {
            "WorkObject": "BBB",
            "LocationName": "BBBB"
        }
    }, {
        "EmpId": 1,
        "EmpName": "A",
        "EmpDtl": {
            "WorkObject": "CCC",
            "LocationName": "CCCC"
        }
    }]
}

Не могли бы вы помочь мне понять, что я делаю здесь неправильно.

1 Ответ

3 голосов
/ 25 октября 2019

Вместо вложенного запроса вам нужно вложить #EmployeeDtl:

SELECT E.EmpId,
       E.EmpName,
       (SELECT ED.WorkObject AS [WorkObject],
               ED.LocationName AS [LocationName]
        FROM #EmployeeDtl ED
        WHERE ED.EmpId = E.EmpId
        FOR JSON PATH) AS EmpDtl
FROM #Employee E
FOR JSON PATH, ROOT('Employees');

Вывод:

{
     "Employees": [
          {
               "EmpId": 1,
               "EmpName": "A",
               "EmpDtl": [
                    {
                         "WorkObject": "AAA",
                         "LocationName": "AAAAA"
                    },
                    {
                         "WorkObject": "BBB",
                         "LocationName": "BBBB"
                    },
                    {
                         "WorkObject": "CCC",
                         "LocationName": "CCCC"
                    }
               ]
          }
     ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...