Формирование сложного JSON объекта через SELECT в SQL Server
Задача - сгенерировать некий JSON объект с вложенной структурой, например для передачи в API методы.
Простой путь - это руками создать весь объект через конкатенацию строк, например:
set @s = '{
"name": "'+@name+'"
}'
У этого подхода 2 минуса:
- легко сломать формат
- спецсимволы в переменных могут быть неверно интерпретированы (например, кавычка).
Более надежный вариант - использовать средства SQL для этого.
К примеру необходимо сделать такой JSON:
{
"model": "GigaChat",
"messages": [
{
"role": "user",
"content": "Скинь мне фото звездного неба, но вместо звезд там будут цифры"
}
],
"stream": false,
"repetition_penalty": 1
}
Как можно с помощью SELECT сделать такой объект:
select 'GigaChat' model,
cast(0 as bit) stream,
1 repetition_penalty,
'user' 'messages.role',
'some text' 'messages.content'
for JSON PATH,WITHOUT_ARRAY_WRAPPER
Примечание:
- WITHOUT_ARRAY_WRAPPER - нужен для того, чтобы вместо массива из одного объекта оставить только сам объект (т.е. убрать []).
Подобным образом можно генерировать сколь угодно сложный JSON, а также получать данные из таблиц БД, причем безопасным способом (кавычки будут экранированы):

ВАЖНО! Лучше не использовать вложенные с JSON PATH с примененим WITHOUT_ARRAY_WRAPPER, т.к. параметр WITHOUT_ARRAY_WRAPPER будет экранировать у вложенного объекта кавычки (и объект получится невалидный).
Что еще посмотреть по SQL Server
SQL. Безопасная разработка на MS SQL (try catch)
SQL. Быстрый поиск хранимых процедур и таблиц в ManagementStudio
SQL. Безопасное приведение типов
SQL. Создание структуры БД через диаграммы
Как оптимизировать массовые операции Update/delete
Нюанс с долгим анализом сложных хранимок
Ищем партнеров-разработчиков на T-SQL и PL/pgSQL
Falcon Space - платформа для создания сайтов с личными кабинетами
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта