Создать JSON из SQL Server 2016+ (используется для команды пути JSON)
Я пытаюсь создать вывод в определенном формате JSON, вот пример вывода (будет повторяться много раз - один раз для каждого университета):
{
"id": "37e556ae6b9f620d2b7262d3de971c40",
"recordType": "school",
"created": 1532531378,
"updated": 1532531378,
"published": 1532531378,
"name": "ABC University – ABC School of Management",
"schoolName": "ABC School of Management",
"universityName": "ABC University",
"sortableName": "ABC School of Management"
}
Я думал, что буду использовать SQL для этого, так как он имеет команду FOR JSON, которая обрабатывает форматирование JSON и будет иметь дело с вложением. Я могу воссоздать вышесказанное, используя следующий код, когда я жестко кодирую значения:
SELECT
HASHBYTES('md5','something') AS id
,'school' AS recordType
,getdate() AS created
,getdate() AS updated
,getdate() AS published
,'ABC University – ABC School of Management' AS name
,'ABC School of Management' as schoolname
,'ABC University' as universityName
, 'ABC School of Management' as sortableName
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
Вопрос, который у меня возник, заключается в том, что мне нужно создать этот вывод 100 раз для разных университетов. Я хочу создать таблицы базы данных в SQL и запустить что-то поверх него. Вот пример данных в Excel, я отфильтровал список, чтобы показать только данные, необходимые для вышеупомянутого и пару других точек данных, которые необходимы в более поздних отдельных выходных данных (я буду беспокоиться о других выходных данных потом):
IndiUID SchoolCode DataValue Ranking Band RegionalRank
OVERALL_SCORE XYZ 105 D 23
SCHOOL_NAME_FORMAL XYZ XYZ Institute of Management
SCHOOL_NAME_SORTABLE XYZ XYZ Institute of Management
SCHOOL_NAME_AND_BUSINESS_SCHOOL_NAME XYZ XYZ Institute of Management, XYZ School of Business
STUDENTS_MEDIAN_AGE XYZ 26
OVERALL_SCORE ABC 35 B 3
SCHOOL_NAME_FORMAL ABC ABC School of Management
SCHOOL_NAME_SORTABLE ABC ABC School of Management
SCHOOL_NAME_AND_BUSINESS_SCHOOL_NAME ABC ABC University – ABC School of Management
STUDENTS_MEDIAN_AGE ABC 26
Я просто не могу понять, как мне нужно структурировать свои таблицы, чтобы я мог выделять соответствующие части с помощью SQL. Мне интересно, следует ли мне поворачивать таблицу так, чтобы значения IndiUID становились полями в таблице базы данных или создавали новую таблицу для каждого из текущих элементов заголовка (DataValue, Ranking, Band и т. Д.).
Я думал, что могу выбрать из таблицы, где indiUID = OVERALL_SCORE, SCHOOL_NAME_FORMAL и т. Д., Но мне интересно, если это слишком грязно.
Вот где я застрял - как мне организовать эти данные в таблицы, чтобы иметь возможность извлечь их? В основном речь идет о создании вывода JSON, поэтому не имеет значения, что часть БД является особенно элегантным решением (это не будет - я очень прост в SQL!).
1 ответ
Вы можете попробовать следующее
Пример данных:
CREATE TABLE [#school]
([school_name_and_business_school_name] VARCHAR(255),
[school_name] VARCHAR(255),
[university_name] VARCHAR(255),
[school_sortable] VARCHAR(255)
);
INSERT INTO [#school]
VALUES
('ABC University – ABC School of Management',
'ABC School of Management',
'ABC University',
'ABC School of Management'
),
('XYZ University – XYZ School of Management',
'XYZ School of Management',
'XYZ University',
'XYZ School of Management'
),
('QWE University – QWEC School of Management',
'QWE School of Management',
'QWE University',
'QWE School of Management'
);
И затем используйте этот запрос:
SELECT HASHBYTES('md5', 'something') AS [id],
'school' AS [recordType],
GETDATE() AS [created],
GETDATE() AS [updated],
GETDATE() AS [published],
[school_name_and_business_school_name] AS [name],
[school_name] AS [schoolName],
[university_name] AS [universityName],
[school_sortable] AS [sortableName]
FROM [#school]
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
Дает вам следующий результат:
{"id":"Q3uTDbhLgHnC3YBKcZNrXw==",
"recordType":"school",
"created":"2018-09-07T10:14:44.130",
"updated":"2018-09-07T10:14:44.130",
"published":"2018-09-07T10:14:44.130",
"name":"ABC University – ABC School of Management",
"schoolName":"ABC School of Management",
"universityName":"ABC University",
"sortableName":"ABC School of Management"
},
{"id":"Q3uTDbhLgHnC3YBKcZNrXw==",
"recordType":"school",
"created":"2018-09-07T10:14:44.130",
"updated":"2018-09-07T10:14:44.130",
"published":"2018-09-07T10:14:44.130",
"name":"XYZ University – XYZ School of Management",
"schoolName":"XYZ School of Management",
"universityName":"XYZ University",
"sortableName":"XYZ School of Management"
},
{"id":"Q3uTDbhLgHnC3YBKcZNrXw==",
"recordType":"school",
"created":"2018-09-07T10:14:44.130",
"updated":"2018-09-07T10:14:44.130",
"published":"2018-09-07T10:14:44.130",
"name":"QWE University – QWEC School of Management",
"schoolName":"QWE School of Management",
"universityName":"QWE University",
"sortableName":"QWE School of Management"
}
Это помогает?