Sdílet prostřednictvím


STRING_AGG (Transact-SQL)

Platí na: SQL Server 2017 (14.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Zřetězí hodnoty řetězcových výrazů a umístí hodnoty oddělovače mezi ně. Oddělovač se nepřidá na konec řetězce.

Transact-SQL konvence syntaxe

Syntax

STRING_AGG ( expression , separator ) [ <order_clause> ]

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

Arguments

expression

Výraz libovolného typu. Výrazy se během zřetězení převedou na typy nvarchar nebo varchar . Neřetězcové typy jsou převedeny na typ nvarchar .

separator

Výraztypu nvarchar nebo varchar, který se používá jako oddělovač pro zřetězené řetězce. Může to být literál nebo proměnná.

<order_clause>

Volitelně můžete zadat pořadí zřetězených výsledků pomocí klauzule WITHIN GROUP:

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

    Seznam ne constantních výrazů , které lze použít k řazení výsledků. Pro každý dotaz je povolen pouze jeden <order_by_expression_list>. Výchozí pořadí řazení je vzestupné.

Návratové typy

Návratový typ závisí na prvním argumentu (výrazu). Pokud je vstupním argumentem typ řetězce (nvarchar, varchar), je typ výsledku stejný jako vstupní typ. V následující tabulce jsou uvedeny automatické převody:

Typ vstupního výrazu Result
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1..4000) nvarchar(4000)
varchar(1..8000) varchar(8000)
int, bigint, smallint, tinyint, numeric, float, real,bit,
desetinný systém, smallmoney, peníze, datetime, datetime2
nvarchar(4000)

Remarks

STRING_AGG je agregační funkce, která přebírá všechny výrazy z řádků a zřetězí je do jednoho řetězce. Hodnoty výrazů jsou implicitně převedeny na typy řetězců a pak zřetězeny. Implicitní převod na řetězce se řídí existujícími pravidly pro převody datových typů. Další informace o převodech datových typů naleznete v tématu CAST a CONVERT.

Pokud je vstupním výrazem typ varchar, oddělovač nemůže být typu nvarchar.

Hodnoty null se ignorují a odpovídající oddělovač se nepřidá. Pokud chcete vrátit držitele místa pro hodnoty null, použijte ISNULL funkci, jak je znázorněno v příkladu B.

STRING_AGG je k dispozici na libovolné úrovni kompatibility.

Note

<order_clause> je k dispozici s úrovní kompatibility databáze 110 a vyšší.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Generování seznamu názvů oddělených v nových řádcích

Následující příklad vytvoří seznam názvů v jedné výsledné buňce oddělené návratem na začátek řádku.

USE AdventureWorks2022;
GO

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

Tady je sada výsledků.

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

NULL hodnoty nalezené v name buňkách se ve výsledku nevracejí.

Note

Pokud použijete editor dotazů aplikace SQL Server Management Studio, možnost Výsledky do mřížky nemůže implementovat návrat na začátek řádku. Pokud chcete správně zobrazit sadu výsledků, přepněte na Výsledky na text. Výsledky na text jsou ve výchozím nastavení zkráceny na 256 znaků. Pokud chcete tento limit zvýšit, změňte Maximální počet znaků zobrazených v každém sloupci možnost.

B. Vygenerování seznamu prostředních názvů oddělených čárkami bez hodnot NULL

Následující příklad nahradí NULL hodnoty N/A a vrátí názvy oddělené čárkami v jedné výsledné buňce.

USE AdventureWorks2022;
GO

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

Tady je oříznutá sada výsledků.

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. Generování hodnot oddělených čárkami

USE AdventureWorks2022;
GO

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

Tady je oříznutá sada výsledků.

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

Pokud použijete editor dotazů aplikace SQL Server Management Studio, možnost Výsledky do mřížky nemůže implementovat návrat na začátek řádku. Pokud chcete správně zobrazit sadu výsledků, přepněte na Výsledky na text. Výsledky na text jsou ve výchozím nastavení zkráceny na 256 znaků. Pokud chcete tento limit zvýšit, změňte Maximální počet znaků zobrazených v každém sloupci možnost.

Představte si databázi, ve které jsou články a jejich značky oddělené do různých tabulek. Vývojář chce vrátit jeden řádek pro každý článek se všemi přidruženými značkami. Následující dotaz dosáhne tohoto výsledku:

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

Tady je sada výsledků.

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

Klauzule GROUP BY se vyžaduje, pokud STRING_AGG funkce není jedinou položkou v seznamu SELECT.

E. Generování seznamu e-mailů na města

Následující dotaz najde e-mailové adresy zaměstnanců a seskupí je podle města:

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

Tady je sada oříznutých výsledků.

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 ...

E-maily vrácené ve sloupci e-mailů se dají použít přímo k odesílání e-mailů skupině lidí pracujících v některých konkrétních městech.

F. Generování seřazeného seznamu e-mailů pro jednotlivá města

Podobně jako v předchozím příkladu následující dotaz najde e-mailové adresy zaměstnanců, seskupí je podle města a seřadí e-maily abecedně:

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

Tady je sada oříznutých výsledků.

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 ...