JSON та агрегація рядків
SQL Server 2025 представляє нові функції агрегації для побудови масивів JSON, об'єктів JSON і розділених рядків. Ці доповнення полегшують створення структурованих виводів, таких як відповіді API, звіти або експорт журналів безпосередньо із запитів T-SQL. Нові функції дають змогу переносити форматування даних на рівень бази даних, зменшуючи потребу в складній трансформації на стороні клієнта.
Огляд функцій JSON та агрегації рядків
Давайте розглянемо три нові функції агрегації:
JSON_ARRAYAGG
Створює масив JSON зі значень виразу. Значення кожного рядка стає елементом результуючого JSON-масиву. Це спрощує генерацію масивів значень, таких як списки ідентифікаторів або імен.
JSON_OBJECTAGG
Створює об'єкт JSON з пар ключ-значення. Перший аргумент визначає ключ, а другий – значення. Таке сполучення значень дозволяє легко створювати JSON-документи безпосередньо з результатів запиту.
STRING_CONCAT_WS
Об'єднує рядки з вказаним роздільником, пропускаючи значення NULL. Назва функції розшифровується як String CONCAT With Separator. Він забезпечує ефективний спосіб об'єднання таких значень, як імена, теги або списки, розділені комами.
Оператор конкатенації рядків ||
SQL Server 2025 вводить стандартний || оператор ANSI як альтернативу + для конкатенації рядків. Він забезпечує більш портативний синтаксис і часто є кращим при об'єднанні кількох стовпців в один текстовий вивід.
Функція UNISTR
UNISTR() повертає рядок Юнікоду на основі екранованих послідовностей, дозволяючи вам вставляти символи за кодовою точкою або екранованим позначенням. Це корисно під час створення сценаріїв, які містять недруковані або багатомовні символи.
Приклад 1: Побудова JSON-масивів та об'єктів із результатів запиту
Уявіть, що ваша база даних зберігає дані про замовлення клієнтів у двох таблицях, Sales.Customer і Sales.SalesOrderHeader. Команді аналітиків потрібен звіт у форматі JSON, що підсумовує кожного клієнта та його ідентифікатори замовлень, для інтеграції з веб-панеллю.
Запит: Використовуйте JSON_ARRAYAGG та JSON_OBJECTAGG
Наступний запит отримує кожного клієнта разом із JSON-масивом їхніх ідентифікаторів замовлень, обгорнутих в об'єкт JSON.
SELECT
C.CustomerID,
C.FirstName + ' ' + C.LastName AS CustomerName,
JSON_OBJECTAGG(
'Customer' : C.CustomerID,
'Orders' : JSON_ARRAYAGG(SOH.SalesOrderID)
) AS CustomerSummary
FROM Sales.Customer AS C
JOIN Sales.SalesOrderHeader AS SOH
ON C.CustomerID = SOH.CustomerID
GROUP BY C.CustomerID, C.FirstName, C.LastName;
Результати
| Ідентифікатор клієнта | Ім'я клієнта | Підсумки клієнта |
|---|---|---|
| 11001 | Джордан Паттерсон | {"Клієнт":11001,"Замовлення":[43722,43723,43724]} |
| 11002 | Алісія Тран | {"Клієнт":11002,"Замовлення":[43725,43726]} |
| 11003 | Марко Діас | {"Клієнт":11003,"Замовлення":[43727]} |
У цьому прикладі JSON_ARRAYAGG збирає всі ідентифікатори замовлень для кожного клієнта в масив JSON і JSON_OBJECTAGG обгортає результат в об'єкт JSON з чіткими парами ключ-значення. Вся структура виробляється в одному T-SQL запиті.
Приклад 2: форматування виведеного тексту за допомогою STRING_CONCAT_WS
Маркетинговій команді потрібен список назв товарів, придбаних кожним клієнтом, розділені комами для email-кампанії. Функція STRING_CONCAT_WS може генерувати ці результати чисто, пропускаючи будь-які значення NULL.
Запит: об'єднання назв продуктів за допомогою роздільника
Наведений нижче запит отримує кожного клієнта разом зі списком товарів, які вони придбали через кому.
SELECT
C.CustomerID,
C.FirstName + ' ' + C.LastName AS CustomerName,
STRING_CONCAT_WS(', ',
P.Name
) AS ProductsPurchased
FROM Sales.Customer AS C
JOIN Sales.SalesOrderHeader AS SOH
ON C.CustomerID = SOH.CustomerID
JOIN Sales.SalesOrderDetail AS SOD
ON SOH.SalesOrderID = SOD.SalesOrderID
JOIN Production.Product AS P
ON SOD.ProductID = P.ProductID
GROUP BY C.CustomerID, C.FirstName, C.LastName;
Результати
| Ідентифікатор клієнта | Ім'я клієнта | ПродукціяПридбано |
|---|---|---|
| 11001 | Джордан Паттерсон | Туринг-2000 Синій, 50, Гірський-100 Чорний, 44 |
| 11002 | Алісія Тран | Дорога-250 Жовта, 44, Гірська-200 Червона, 48 |
| 11003 | Марко Діас | Турінг-3000 Синій, 62 |
Тут STRING_CONCAT_WS об'єднує назви продуктів комами та автоматично ігнорує NULL-записи, уникаючи ручного COALESCEкерування або ISNULL логіки.
Приклад 3: поєднання JSON і розділеного тексту для виводу API
Ви також можете використовувати ці функції разом для підготовки структурованих даних для відповіді API. Наступний запит створює JSON-масив об'єктів, де кожен об'єкт містить ім'я клієнта та список товарів, розділений комами.
SELECT
JSON_ARRAYAGG(
JSON_OBJECTAGG(
'Customer' : C.FirstName + ' ' + C.LastName,
'Products' : STRING_CONCAT_WS(', ', P.Name)
)
) AS ApiOutput
FROM Sales.Customer AS C
JOIN Sales.SalesOrderHeader AS SOH
ON C.CustomerID = SOH.CustomerID
JOIN Sales.SalesOrderDetail AS SOD
ON SOH.SalesOrderID = SOD.SalesOrderID
JOIN Production.Product AS P
ON SOD.ProductID = P.ProductID
GROUP BY C.CustomerID, C.FirstName, C.LastName;
Зразок результату
[
{"Customer":"Jordan Patterson","Products":"Touring-2000 Blue, 50, Mountain-100 Black, 44"},
{"Customer":"Alicia Tran","Products":"Road-250 Yellow, 44, Mountain-200 Red, 48"},
{"Customer":"Marco Diaz","Products":"Touring-3000 Blue, 62"}
]
Програма безпосередньо використовує цю структуру або експортує її як документ JSON за допомогою таких інструментів, як SQL Server Management Studio (SSMS) або Azure Data Studio.
Зведення
SQL Server 2025 додає JSON_ARRAYAGG, JSON_OBJECTAGG, і для спрощення STRING_CONCAT_WS побудови структурованого тексту та виводу JSON у T-SQL. Ці функції дозволяють генерувати готові до застосування дані із запитів без зовнішнього коду. Незалежно від того, чи готуєте ви корисне навантаження JSON, створюєте звіти чи форматуєте відповіді API, ці функції агрегації роблять SQL Server 2025 більш універсальною платформою для сучасних програм обробки даних.