Megosztás a következőn keresztül:


STRING_AGG (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2017 (14.x) és későbbi verziók Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric SQLdatabase in Microsoft Fabric

Összefűzi a sztringkifejezések értékeit, és elválasztó értékeket helyez el egymás között. Az elválasztó nem lesz hozzáadva a sztring végén.

Transact-SQL szintaxis konvenciói

Syntax

STRING_AGG ( expression , separator ) [ <order_clause> ]

<order_clause> ::=
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

Arguments

expression

Bármilyen típusú kifejezés . A kifejezések nvarchar vagy varchar típusúvá alakulnak az összefűzés során. A nem sztringtípusok nvarchar típusúvá alakulnak.

separator

Az összefűzött sztringek elválasztójaként használt nvarchar vagy varchar típusú kifejezés. Lehet literál vagy változó.

<order_clause>

Ha szeretné, adja meg az összefűzött eredmények sorrendjét WITHIN GROUP záradék használatával:

WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
  • <order_by_expression_list>

    Az eredmények rendezéséhez használható nem állandó kifejezések listája. Lekérdezésenként csak egy <order_by_expression_list> engedélyezett. Az alapértelmezett rendezési sorrend növekvő.

Visszatérési típusok

A visszatérési típus az első argumentumtól (kifejezéstől) függ. Ha a bemeneti argumentum sztring típusú (nvarchar, varchar), az eredmény típusa megegyezik a bemeneti típussal. Az alábbi táblázat az automatikus átalakításokat sorolja fel:

Beviteli kifejezés típusa Result
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1..4000) nvarchar(4000)
varchar(1..8000) varchar(8000)
int, bigint, smallint, tinyint, numerikus, lebegő, valós, bit,
decimális, smallmoney, pénz, datetime, datetime2
nvarchar(4000)

Remarks

STRING_AGG egy aggregátumfüggvény, amely a sorok összes kifejezését egyetlen sztringbe fűzi össze. A kifejezésértékek implicit módon sztringtípusokká alakulnak, majd összefűződnek. A sztringekre való implicit átalakítás az adattípus-átalakításokra vonatkozó meglévő szabályokat követi. Az adattípus-átalakításokról további információt a CAST és a CONVERTcímű témakörben talál.

Ha a bemeneti kifejezés varchar típusú, az elválasztó nem lehet nvarchar típusú.

A null értékek figyelmen kívül lesznek hagyva, és a megfelelő elválasztó nem lesz hozzáadva. Null értékek helyőrzőjének visszaadásához használja a függvényt a ISNULLB példában bemutatott módon.

STRING_AGG bármilyen kompatibilitási szinten elérhető.

Note

<order_clause> a 110-es vagy újabb adatbázis-kompatibilitási szinttel érhető el.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. Új sorokban elválasztott nevek listájának létrehozása

Az alábbi példa egy névlistát hoz létre egyetlen eredménycellában, kocsivisszajellel elválasztva.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO

Itt van az eredményhalmaz.

csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...

NULL name cellákban található értékek nem jelennek meg az eredményben.

Note

Ha az SQL Server Management Studio Lekérdezésszerkesztőt használja, az Eredmények rácsba lehetőség nem tudja implementálni a kocsivisszaszolgáltatást. Váltson Találatok szövegre az eredménykészlet megfelelő megjelenítéséhez. A szövegre adott találatok alapértelmezés szerint 256 karakterből állnak. A korlát növeléséhez módosítsa az egyes oszlopokban karakterek maximális számát.

B. Null érték nélküli vesszővel elválasztott középső nevek listájának létrehozása

Az alábbi példa az értékeket NULL egyetlen eredménycellában vesszővel elválasztott nevekre N/A cseréli és adja vissza.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO

Íme egy levágott eredménykészlet.

csv
-----
E,R.,N/A,N/A,B,E,N/A,N/A,N/A,N/A,G,B,N/A,C,J,L,P,N/A,M,N/A,N/A,N/A,L,J., ...

C. Vesszővel tagolt értékek létrehozása

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO

Íme egy levágott eredménykészlet.

names
-------
Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (Dec 29 2001 12:00AM)
...

Note

Ha az SQL Server Management Studio Lekérdezésszerkesztőt használja, az Eredmények rácsba lehetőség nem tudja implementálni a kocsivisszaszolgáltatást. Váltson Találatok szövegre az eredménykészlet megfelelő megjelenítéséhez. A szövegre adott találatok alapértelmezés szerint 256 karakterből állnak. A korlát növeléséhez módosítsa az egyes oszlopokban karakterek maximális számát.

Képzeljen el egy adatbázist, amelyben a cikkek és címkéik különböző táblákba vannak elválasztva. A fejlesztő minden cikkben egy sort szeretne visszaadni az összes társított címkével. Az alábbi lekérdezés ezt az eredményt éri el:

SELECT a.articleId,
       title,
       STRING_AGG(tag, ',') AS tags
FROM dbo.Article AS a
     LEFT OUTER JOIN dbo.ArticleTag AS t
         ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;
GO

Itt van az eredményhalmaz.

articleId title tags
172 Polls indicate close election results politics,polls,city council
176 New highway expected to reduce congestion NULL
177 Dogs continue to be more popular than cats polls,animals

Note

A GROUP BY záradékra akkor van szükség, ha a STRING_AGG függvény nem az egyetlen elem a SELECT listában.

E. Városonkénti e-mailek listájának létrehozása

Az alábbi lekérdezés megkeresi az alkalmazottak e-mail-címét, és városonként csoportosítja őket:

USE AdventureWorks2022;
GO

SELECT TOP 10 City,
              STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') AS emails
FROM Person.BusinessEntityAddress AS BEA
     INNER JOIN Person.Address AS A
         ON BEA.AddressID = A.AddressID
     INNER JOIN Person.EmailAddress AS EA
         ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO

Itt található a levágott eredményhalmaz.

City emails
Ballard paige28@adventure-works.com;;joshua24@adventure-works.com;javier12@adventure-works.com ...
Baltimore gilbert9@adventure-works.com
Barstow kristen4@adventure-works.com
Basingstoke Hants dale10@adventure-works.com;heidi9@adventure-works.com
Baytown kelvin15@adventure-works.com
Beaverton billy6@adventure-works.com;;dalton35@adventure-works.com;lawrence1@adventure-works.com ...
Bell Gardens christy8@adventure-works.com
Bellevue min0@adventure-works.com;;gigi0@adventure-works.com;terry18@adventure-works.com ...
Bellflower philip0@adventure-works.com;;emma34@adventure-works.com;jorge8@adventure-works.com ...
Bellingham christopher23@adventure-works.com;;frederick7@adventure-works.com;omar0@adventure-works.com ...

Az e-mailek oszlopban visszaadott e-mailek közvetlenül felhasználhatók arra, hogy e-maileket küldjenek bizonyos városokban dolgozó személyek csoportjának.

F. Városonkénti e-mailek rendezett listájának létrehozása

Az előző példához hasonlóan az alábbi lekérdezés megkeresi az alkalmazottak e-mail-címét, városonként csoportosítja őket, és betűrendbe rendezi az e-maileket:

USE AdventureWorks2022;
GO

SELECT TOP 10 City,
              STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') WITHIN GROUP (ORDER BY EmailAddress ASC) AS Emails
FROM Person.BusinessEntityAddress AS BEA
     INNER JOIN Person.Address AS A
         ON BEA.AddressID = A.AddressID
     INNER JOIN Person.EmailAddress AS EA
         ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO

Itt található a levágott eredményhalmaz.

City Emails
Barstow kristen4@adventure-works.com
Basingstoke Hants dale10@adventure-works.com;heidi9@adventure-works.com
Braintree mindy20@adventure-works.com
Bell Gardens christy8@adventure-works.com
Byron louis37@adventure-works.com
Bordeaux ranjit0@adventure-works.com
Carnation don0@adventure-works.com;;douglas0@adventure-works.com;george0@adventure-works.com ...
Boulogne-Billancourt allen12@adventure-works.com;;bethany15@adventure-works.com;carl5@adventure-works.com ...
Berkshire barbara41@adventure-works.com;;brenda4@adventure-works.com;carrie14@adventure-works.com ...
Berks adriana6@adventure-works.com;;alisha13@adventure-works.com;arthur19@adventure-works.com ...