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 beliebigen Typs. Ausdrücke werden während der Verkettung in NVARCHAR
- oder VARCHAR
-Typen konvertiert. Typen, die keine Zeichenfolgen darstellen, werden in den NVARCHAR
-Typ konvertiert.
Trennzeichen
Ein Ausdruck vom Typ NVARCHAR
oder VARCHAR
, 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
-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 ein Zeichenfolgentyp (NVARCHAR
, VARCHAR
) ist, entspricht der Ergebnistyp dem Eingabetyp. 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, numeric, float, real, bit, decimal, smallmoney, money, 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 (Transact-SQL).
Wenn der Eingabeausdruck den Typ VARCHAR
aufweist, kann das Trennzeichen nicht vom Typ NVARCHAR
sein.
NULL-Werte werden ignoriert, und das entsprechende Trennzeichen wird nicht hinzugefügt. Verwenden Sie wie in Beispiel B dargestellt die ISNULL
-Funktion, um einen Platzhalter für NULL-Werte zurückzugeben.
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 meisten Beispiele in diesem Artikel verweisen auf die AdventureWorks-Beispieldatenbanken.
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 SQL Server Management Studio-Abfrage-Editor verwenden, kann die Option Ergebnisse in 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 ohne NULL-Werte, die mit Trennzeichen getrennt ist
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 sehen Sie das Ergebnis.
Hinweis
Die gezeigten Ergebnisse sind gekürzt.
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 sehen Sie das Ergebnis.
Hinweis
Die gezeigten Ergebnisse sind gekürzt.
Namen |
---|
Ken Sánchez (8. Feb. 2003 12:00 Uhr) Terri Duffy (24. Feb. 2002 12:00 Uhr) Roberto Tamburello (5. Dez. 2001 12:00 Uhr) Rob Walters (29. Dez. 2001 12:00 Uhr) ... |
Hinweis
Wenn Sie den Abfrage-Editor von Management Studio verwenden, kann die Option Ergebnisse in Raster den Wagenrücklauf 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 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 | Umfragen deuten auf knappe Wahlergebnisse hin | politics,polls,city council |
176 | Neue Autobahn soll Überlastung reduzieren | NULL |
177 | Hunde sind weiterhin beliebter als Katzen | 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 ... |
Nächste Schritte
Weitere Informationen zu Transact-SQL-Funktionen finden Sie in den folgenden Artikeln: