Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na: SQL Server 2017 (14.x) a novější verze
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL 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.
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.
D. Vrácení příspěvků se souvisejícími značkami
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 ... |
Související obsah
- STRING_ESCAPE (Transact-SQL)
- VĚCI (Transact-SQL)
- CONCAT (Transact-SQL)
- CONCAT_WS (Transact-SQL)
- agregační funkce
(Transact-SQL) -
řetězcové funkce (Transact-SQL)