JSON și agregarea șirurilor

Finalizat

SQL Server 2025 introduce noi funcții de agregare pentru construirea de matrice JSON, obiecte JSON și șiruri delimitate. Aceste adăugiri facilitează generarea de rezultate structurate, cum ar fi răspunsuri API, rapoarte sau exporturi de jurnale direct din interogări T-SQL. Noile funcții vă permit să mutați formatarea datelor în stratul bazei de date, reducând nevoia de transformare complexă pe partea clientului.

Prezentare generală a funcțiilor JSON și de agregare a șirurilor

Să ne uităm la cele trei noi funcții de agregare:

JSON_ARRAYAGG

Creează o matrice JSON din valorile unei expresii. Valoarea fiecărui rând devine un element în matricea JSON rezultată. Simplifică generarea de matrice de valori, cum ar fi liste de ID-uri sau nume.

JSON_OBJECTAGG

Creează un obiect JSON din perechi cheie-valoare. Primul argument definește cheia, iar al doilea definește valoarea. Această asociere de valori facilitează construirea documentelor JSON direct din rezultatele interogării.

STRING_CONCAT_WS

Concatenează șirurile cu un separator specificat în timp ce se omit valorile NULL. Numele funcției înseamnă String CONCAT With Separator. Oferă o modalitate eficientă de a uni valori precum nume, etichete sau liste delimitate prin virgulă.

Operator de concatenare a șirurilor ||

SQL Server 2025 introduce operatorul standard || ANSI ca alternativă la + concatenarea șirurilor. Oferă o sintaxă mai portabilă și este adesea preferată atunci când combinați mai multe coloane într-o singură ieșire text.

Funcția UNISTR

UNISTR() returnează un șir Unicode bazat pe secvențe de evadare, permițându-vă să inserați caractere prin punct de cod sau notație de evadare. Este util atunci când creați scripturi care includ caractere neimprimabile sau multilingve.

Exemplul 1: Construiți matrice și obiecte JSON din rezultatele interogării

Imaginați-vă că baza de date stochează datele comenzilor clienților în două tabele Sales.Customer și Sales.SalesOrderHeader. Echipa de analiză are nevoie de un raport JSON care să rezume fiecare client și ID-urile comenzilor sale pentru integrarea cu un tablou de bord web.

Interogare: Utilizați JSON_ARRAYAGG și JSON_OBJECTAGG

Următoarea interogare preia fiecare client împreună cu o matrice JSON a ID-urilor lor de comandă, înfășurate într-un obiect 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;

Rezultate

ID client Nume client Rezumatul clientului
11001 Jordan Patterson {"Client":11001,"Comenzi":[43722,43723,43724]}
11002 Alicia Tran {"Client":11002,"Comenzi":[43725,43726]}
11003 Marco Diaz {"Client":11003,"Comenzi":[43727]}

În acest exemplu, JSON_ARRAYAGG colectează toate ID-urile de comandă pentru fiecare client într-o matrice JSON și JSON_OBJECTAGG înfășoară rezultatul într-un obiect JSON cu perechi cheie-valoare clare. Întreaga structură este produsă într-o singură interogare T-SQL.

Exemplul 2: Formatați ieșirea textului folosind STRING_CONCAT_WS

Echipa de marketing are nevoie de o listă cu numele produselor achiziționate de fiecare client, separate prin virgule pentru o campanie de e-mail. Funcția STRING_CONCAT_WS poate genera aceste rezultate în mod curat, omițând orice valori NULL.

Interogare: Asocierea numelor de produse cu un separator

Următoarea interogare preia fiecare client împreună cu o listă separată prin virgulă a produselor pe care le-au achiziționat.

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;

Rezultate

ID client Nume client ProduseAchiziționate
11001 Jordan Patterson Touring-2000 Albastru, 50, Mountain-100 Negru, 44
11002 Alicia Tran Drum-250 Galben, 44, Munte-200 Roșu, 48
11003 Marco Diaz Touring-3000 Albastru, 62

Aici, STRING_CONCAT_WS unește numele produselor cu virgule și ignoră automat intrările NULL, evitând manualul COALESCEsau ISNULL logica.

Exemplul 3: Combinați JSON și text delimitat pentru ieșirea API

De asemenea, puteți utiliza aceste funcții împreună pentru a pregăti date structurate pentru un răspuns API. Următoarea interogare creează o matrice JSON de obiecte în care fiecare obiect conține numele unui client și o listă de produse delimitate prin virgulă.

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;

Eșantion de rezultat

[
  {"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"}
]

O aplicație consumă direct această structură sau o exportă ca document JSON prin instrumente precum SQL Server Management Studio (SSMS) sau Azure Data Studio.

Rezumat

SQL Server 2025 adaugă JSON_ARRAYAGG, JSON_OBJECTAGG, și STRING_CONCAT_WS pentru a simplifica construirea de text structurat și ieșire JSON în T-SQL. Aceste funcții vă permit să generați date gata de aplicație din interogări fără cod extern. Indiferent dacă pregătiți sarcini JSON, construiți rapoarte sau formatați răspunsuri API, aceste caracteristici de agregare fac din SQL Server 2025 o platformă mai versatilă pentru aplicațiile moderne de date.