Delen via


STRING_AGG (Transact-SQL)

Applies to: SQL Server 2017 (14.x) and later Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

Voegt de waarden van tekenreeksexpressies samen en plaatst scheidingstekens tussen de expressies. Het scheidingsteken wordt niet toegevoegd aan het einde van de tekenreeks.

Transact-SQL syntaxisconventies

Syntax

STRING_AGG ( expression , separator ) [ <order_clause> ]

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

Arguments

expression

An expression of any type. Expressions are converted to nvarchar or varchar types during concatenation. Non-string types are converted to nvarchar type.

separator

An expression of nvarchar or varchar type that is used as separator for concatenated strings. Dit kan letterlijk of variabel zijn.

<order_clause>

Geef desgewenst de volgorde op van samengevoegde resultaten met behulp van WITHIN GROUP component:

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

    A list of non-constant expressions that can be used for sorting results. Er is slechts één <order_by_expression_list> per query toegestaan. De standaardsorteerdervolgorde is oplopend.

Return types

Het retourtype is afhankelijk van het eerste argument (expressie). If input argument is string type (nvarchar, varchar), the result type is the same as the input type. De volgende tabel bevat automatische conversies:

Type invoerexpressie 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,
decimal, smallmoney, money, datetime, datetime2
nvarchar(4000)

Remarks

STRING_AGG is een statistische functie die alle expressies uit rijen neemt en deze samenvoegt in één tekenreeks. Expressiewaarden worden impliciet geconverteerd naar tekenreekstypen en vervolgens samengevoegd. De impliciete conversie naar tekenreeksen volgt de bestaande regels voor conversies van gegevenstypen. Zie CAST en CONVERTvoor meer informatie over conversies van gegevenstypen.

If the input expression is type varchar, the separator can't be type nvarchar.

Null-waarden worden genegeerd en het bijbehorende scheidingsteken wordt niet toegevoegd. To return a place holder for null values, use the ISNULL function as demonstrated in example B.

STRING_AGG is beschikbaar in elk compatibiliteitsniveau.

Note

<order_clause> is beschikbaar met databasecompatibiliteitsniveau 110 en hoger.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

A. Lijst met namen genereren die zijn gescheiden in nieuwe regels

In het volgende voorbeeld wordt een lijst met namen in één resultaatcel gegenereerd, gescheiden door regelterugloop.

USE AdventureWorks2022;
GO

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

Dit is de resultatenset.

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

NULL waarden in name cellen niet worden geretourneerd in het resultaat.

Note

Als u de QUERY-editor van SQL Server Management Studio gebruikt, kan de optie Resultaten naar raster de regelterugloop niet implementeren. Schakel over naar resultaten naar tekst om de resultatenset correct weer te geven. Resultaten naar tekst worden standaard afgekapt tot 256 tekens. Als u deze limiet wilt verhogen, wijzigt u het Maximum aantal tekens dat wordt weergegeven in elke kolom optie.

B. Lijst met middelste namen genereren, gescheiden door komma's zonder NULL-waarden

Het volgende voorbeeld vervangt waarden door N/A en retourneert NULL de namen gescheiden door komma's in één resultaatcel.

USE AdventureWorks2022;
GO

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

Hier volgt een bijgesneden resultatenset.

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. Door komma's gescheiden waarden genereren

USE AdventureWorks2022;
GO

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

Hier volgt een bijgesneden resultatenset.

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

Als u de QUERY-editor van SQL Server Management Studio gebruikt, kan de optie Resultaten naar raster de regelterugloop niet implementeren. Schakel over naar resultaten naar tekst om de resultatenset correct weer te geven. Resultaten naar tekst worden standaard afgekapt tot 256 tekens. Als u deze limiet wilt verhogen, wijzigt u het Maximum aantal tekens dat wordt weergegeven in elke kolom optie.

Stel dat een database is waarin artikelen en de bijbehorende tags worden gescheiden in verschillende tabellen. Een ontwikkelaar wil één rij retourneren per artikel met alle bijbehorende tags. Met de volgende query wordt dit resultaat bereikt:

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

Dit is de resultatenset.

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

De GROUP BY-component is vereist als de functie STRING_AGG niet het enige item in de SELECT lijst is.

E. Lijst met e-mailberichten per plaats genereren

Met de volgende query worden de e-mailadressen van werknemers gevonden en gegroepeerd op plaats:

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

Hier volgt de bijgesneden resultatenset.

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-mailberichten die in de kolom e-mailberichten worden geretourneerd, kunnen rechtstreeks worden gebruikt om e-mailberichten te verzenden naar een groep personen die in bepaalde steden werken.

F. Een gesorteerde lijst met e-mailberichten per plaats genereren

Net als in het vorige voorbeeld zoekt de volgende query de e-mailadressen van werknemers, groepeert ze op plaats en sorteert de e-mailberichten alfabetisch:

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

Hier volgt de bijgesneden resultatenset.

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