Freigeben über


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.

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