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.

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: