Delen via


STRING_AGG (Transact-SQL)

van toepassing op: SQL Server 2017 (14.x) en hoger Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL Analytics-eindpunt 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

Syntaxis

STRING_AGG ( expression , separator ) [ <order_clause> ]

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

Argumenten

expressie

Een expressie van elk type. Expressies worden tijdens het samenvoegen geconverteerd naar nvarchar- of varchar typen. Niet-tekenreekstypen worden geconverteerd naar nvarchar type.

scheidingsteken

Een -expressie van nvarchar of varchar type dat wordt gebruikt als scheidingsteken voor samengevoegde tekenreeksen. 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>

    Een lijst met niet-constante expressies die kunnen worden gebruikt voor het sorteren van resultaten. Er is slechts één <order_by_expression_list> per query toegestaan. De standaardsorteerdervolgorde is oplopend.

Retourtypen

Het retourtype is afhankelijk van het eerste argument (expressie). Als het invoerargument tekenreekstype is (nvarchar, varchar), is het resultaattype hetzelfde als het invoertype. De volgende tabel bevat automatische conversies:

Type invoerexpressie Resultaat
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1..4000) nvarchar(4000)
varchar(1.8000) varchar(8000)
int, bigint, smallint, kleineint, numerieke, zwevende, echte, bit,
decimale, smallmoney, geld, datum/tijd, datetime2
nvarchar(4000)

Opmerkingen

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.

Als de invoerexpressie varchar-is, kan het scheidingsteken niet worden getypt nvarchar.

Null-waarden worden genegeerd en het bijbehorende scheidingsteken wordt niet toegevoegd. Als u een tijdelijke aanduiding voor null-waarden wilt retourneren, gebruikt u de functie ISNULL zoals wordt weergegeven in voorbeeld B.

STRING_AGG is beschikbaar in elk compatibiliteitsniveau.

Notitie

<order_clause> is beschikbaar met databasecompatibiliteitsniveau 110 en hoger.

Voorbeelden

De Transact-SQL codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase, die u kunt downloaden van de Microsoft SQL Server-voorbeelden en communityprojecten startpagina.

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

Notitie

Als u de QUERY-editor van SQL Server Management Studio gebruikt, kan de optie Resultaten naar Grid 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 namen genereren die zijn gescheiden door komma's zonder NULL waarden

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

USE AdventureWorks2022;
GO

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

Hier volgt een bijgesneden resultatenset.

csv
-----
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ...

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

Notitie

Als u de Query-editor van Management Studio gebruikt, kan de optie Resultaten naar Grid de regelterugloop niet implementeren. Schakel over naar resultaten naar tekst om de resultatenset correct weer te geven.

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

Notitie

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

Dit is de resultatenset.

Notitie

De resultaten worden ingekort weergegeven.

Stad e-mailberichten
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

Dit is de resultatenset.

Notitie

De resultaten worden ingekort weergegeven.

Stad E-mailberichten
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;...