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 більш універсальною платформою для сучасних програм обробки даних.