Freigeben über


STRING_AGG (Transact-SQL)

Gilt für: SQL Server 2017 (14.x) und spätere versionen: Azure SQL Database: Azure SQL Managed InstanceAzure Synapse Analytics,SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric SQLdatabase 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 ] )

Arguments

expression

Ein Ausdruck eines beliebigen Typs. Ausdrücke werden während der Verkettung in nvarchar - oder varchar-Typen konvertiert. Nicht-Zeichenfolgentypen werden in den nvarchar-Typ konvertiert.

separator

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 nicht konstanter Ausdrücke , die zum Sortieren von Ergebnissen verwendet werden können. 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 (nvarchar, varchar) ist, entspricht der Ergebnistyp dem Eingabetyp. In der folgenden Tabelle werden die automatischen Konvertierungen aufgeführt:

Typ des Eingabeausdrucks 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,
Dezimalzahl, Kleinmoney, Geld, Datetime, Datetime2
nvarchar(4000)

Remarks

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 " varchar" ist, kann das Trennzeichen nicht " nvarchar" sein.

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 im Beispiel B dargestellt.

STRING_AGG ist in jedem Kompatibilitätsgrad verfügbar.

Note

<order_clause> ist mit dem Datenbank-Kompatibilitätsgrad 110 und höher verfügbar.

Examples

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 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.

Note

Wenn Sie den SQL Server Management Studio-Abfrage-Editor verwenden, kann die Option Ergebnisse zum Raster nicht die Wagenrücklauffunktion 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 mit mittleren Namen, die durch Komma ohne NULL-Werte getrennt sind

Im folgenden Beispiel werden Werte durch NULL Kommas in einer einzelnen Ergebniszelle ersetzt N/A und die Namen zurückgegeben, die durch Kommas getrennt sind.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO

Hier ist ein gekürztes Resultset.

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. 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)
...

Note

Wenn Sie den SQL Server Management Studio-Abfrage-Editor verwenden, kann die Option Ergebnisse zum Raster nicht die Wagenrücklauffunktion 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.

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

Note

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 gekürzte Resultset.

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 gekürzte Resultset.

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 ...