Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2017 (14.x) en latere versies
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics SQL Analytics-eindpunt
in Microsoft Fabric
Warehouse 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
Een expressie van elk type. Expressies worden tijdens het samenvoegen geconverteerd naar nvarchar - of varchar-typen . Niet-tekenreekstypen worden geconverteerd naar het type nvarchar .
separator
Een expressie van het type nvarchar of varchar 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 | Result |
|---|---|
| nvarchar(max) | nvarchar(max) |
| varchar(max) | varchar(max) |
| nvarchar(1..4000) | nvarchar(4000) |
| varchar(1..8000) | varchar(8000) |
|
int, bigint, smallint, tinyint, numeriek, 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.
Als de invoerexpressie varchar is, kan het scheidingsteken niet nvarchar worden getypt.
Null-waarden worden genegeerd en het bijbehorende scheidingsteken wordt niet toegevoegd. Als u een tijdelijke aanduiding voor null-waarden wilt retourneren, gebruikt u de ISNULL functie zoals wordt gedemonstreerd in voorbeeld 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 NULL en retourneert N/A 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.
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 | 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; ... |