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.
Applies to: SQL Server 2017 (14.x) and later
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint 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
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.
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 ; ... |