STRING_AGG (Transact-SQL)
Gilt für: SQL Server 2017 (14.x) und höher Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric Warehouse in Microsoft Fabric
Verkettet die Werte von Zeichenfolgenausdrücken und platziert Trennzeichenwerte zwischen diesen. Das Trennzeichen wird am Ende einer Zeichenfolge nicht hinzugefügt.
Transact-SQL-Syntaxkonventionen
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Argumente
expression
Ein Ausdruck eines beliebigen Typs. Ausdrücke werden während der Verkettung in nvarchar oder varchar Typen konvertiert. Nicht-Zeichenfolgentypen werden in nvarchar- Typ konvertiert.
Trennzeichen
Ein Ausdrucknvarchar oder varchar Typs, der als Trennzeichen für verkettete Zeichenfolgen verwendet wird. Dieser kann ein Literal oder eine Variable sein.
<order_clause>
Geben Sie mithilfe der WITHIN GROUP
-Klausel optional die Reihenfolge der verketteten Ergebnisse an:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>
Eine Liste von nicht konstanten Ausdrücken, die für das Sortieren von Ergebnissen verwendet werden kann. Nur ein
<order_by_expression_list>
-Element ist pro Abfrage zulässig. Standardmäßig wird die Sortierung in aufsteigender Reihenfolge vorgenommen.
Rückgabetypen
Der Rückgabetyp hängt vom ersten Argument (Ausdruck) ab. Wenn das Eingabeargument Zeichenfolgentyp ist (nvarchar, varchar), ist der Ergebnistyp mit dem Eingabetyp identisch. In der folgenden Tabelle werden die automatischen Konvertierungen aufgeführt:
Typ des Eingabeausdrucks | Ergebnis |
---|---|
nvarchar(max) | nvarchar(max) |
varchar(max) | varchar(max) |
nvarchar(1..4000) | nvarchar(4000) |
varchar(1..8000) | varchar(8000) |
int, bigint, smallint, tinyint, numerische, float, reale, Bit-, dezimale, smallmoney, Geld, datetime, datetime2 |
nvarchar(4000) |
Hinweise
Bei STRING_AGG
handelt es sich um eine Aggregatfunktion, die alle Ausdrücke aus Zeilen zu einer einzelnen Zeichenfolge verkettet. Ausdruckswerte werden implizit in Zeichenfolgentypen konvertiert und dann verkettet. Die implizite Konvertierung in Zeichenfolgen erfolgt basierend auf den vorhandenen Regeln für Datentypkonvertierungen. Weitere Informationen zu Datentypkonvertierungen finden Sie unter CAST und CONVERT.
Wenn der Eingabeausdruck varcharist, kann das Trennzeichen nicht nvarchareingegeben werden.
Nullwerte werden ignoriert, und das entsprechende Trennzeichen wird nicht hinzugefügt. Um einen Platzhalter für NULL-Werte zurückzugeben, verwenden Sie die ISNULL
-Funktion, wie in Beispiel Bdargestellt.
STRING_AGG
ist in jedem Kompatibilitätsgrad verfügbar.
Hinweis
<order_clause>
ist mit dem Datenbank-Kompatibilitätsgrad 110 und höher verfügbar.
Beispiele
Die Transact-SQL Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.
A. Generieren einer Liste von Namen, die in neuen Zeilen getrennt sind
Im folgenden Beispiel wird eine Liste von Namen in einer einzelnen Ergebniszelle erstellt, die mit Wagenrückläufen getrennt sind.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Hier sehen Sie das Ergebnis.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
NULL
-Werte, die in name
-Zellen gefunden werden, werden im Ergebnis nicht zurückgegeben.
Hinweis
Wenn Sie den ABFRAGE-Editor von SQL Server Management Studio verwenden, kann die Option Ergebnisse zum Raster den Wagenrücklauf nicht implementieren. Wechseln Sie zu Ergebnisse in Text, um das Resultset ordnungsgemäß anzuzeigen. Ergebnisse in Text werden standardmäßig auf 256 Zeichen gekürzt. Zum Erhöhen dieses Limits müssen Sie die Option Pro Spalte angezeigte maximale Anzahl von Zeichen anpassen.
B. Generieren einer Liste von Namen, die durch Kommas getrennt sind, ohne NULL
Werte
Im folgenden Beispiel werden NULL-Werte durch „N/A“ ersetzt. Weiterhin werden die Namen durch Trennzeichen getrennt in einer einzelnen Ergebniszelle zurückgegeben.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(FirstName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Hier ist ein gekürztes Resultset.
csv
-----
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ...
C. Generieren von durch Trennzeichen getrennten Werten
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Hier ist ein gekürztes Resultset.
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)
...
Hinweis
Wenn Sie den Management Studio-Abfrage-Editor verwenden, kann die Option Ergebnisse zum Raster die Wagenrücklaufoption nicht implementieren. Wechseln Sie zu Ergebnisse in Text, um das Resultset ordnungsgemäß anzuzeigen.
D: Zurückgeben von Artikeln mit zugehörigen Tags
Stellen Sie sich eine Datenbank vor, in der Artikel und deren Tags in verschiedene Tabellen unterteilt sind. Ein Entwickler möchte eine Zeile mit allen zugehörigen Tags pro Artikel zurückgeben. Die folgende Abfrage erzielt dieses Ergebnis:
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
Hier sehen Sie das Ergebnis.
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 |
Hinweis
Die GROUP BY
-Klausel ist erforderlich, wenn die STRING_AGG
-Funktion nicht das einzige Element in der SELECT
-Liste ist.
E. Generieren einer Liste von E-Mails pro Stadt
Die folgende Abfrage sucht die E-Mail-Adressen der Angestellten und gruppiert diese nach Städten:
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 sehen Sie das Ergebnis.
Hinweis
Die gezeigten Ergebnisse sind gekürzt.
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 ... |
Die E-Mail-Adressen, die in der Spalte „E-Mail-Adresse“ zurückgegeben werden, können direkt verwendet werden, um E-Mails an mehrere Personen zu senden, die in bestimmten Städten arbeiten.
F. Generieren einer sortierten Liste von E-Mails pro Stadt
Ähnlich wie beim vorherigen Beispiel sucht die folgende Abfrage die E-Mail-Adressen der Angestellten, gruppiert diese nach Stadt und sortiert die E-Mail-Adressen alphabetisch:
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 sehen Sie das Ergebnis.
Hinweis
Die gezeigten Ergebnisse sind gekürzt.
City | E-Mails |
---|---|
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 ... |