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.
D. Nieuwsartikelen retourneren met verwante tags
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 ;... |