STRING_AGG (Transact-SQL)STRING_AGG (Transact-SQL)

Dieses Thema gilt für:JaSQL Server (beginnend mit 2017)JaAzure SQL-DatenbankkeineAzure SQL Data Warehouse keineParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2017)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Verkettet die Werte von Zeichenfolgenausdrücken und platziert Trennzeichenwerte zwischen diesen.Concatenates the values of string expressions and places separator values between them. Das Trennzeichen wird am Ende einer Zeichenfolge nicht hinzugefügt.The separator is not added at the end of string.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

STRING_AGG ( expression, separator ) [ <order_clause> ]

<order_clause> ::=   
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )   

ArgumenteArguments

expressionexpression
Ein Ausdruck beliebigen Typs.Is an expression of any type. Ausdrücke werden während der Verkettung in NVARCHAR- oder VARCHAR-Typen konvertiert.Expressions are converted to NVARCHAR or VARCHAR types during concatenation. Typen, die keine Zeichenfolgen darstellen, werden in den NVARCHAR-Typ konvertiert.Non-string types are converted to NVARCHAR type.

Trennzeichenseparator
Ein Ausdruck vom Typ NVARCHAR oder VARCHAR, der als Trennzeichen für verkettete Zeichenfolgen verwendet wird.Is an expression of NVARCHAR or VARCHAR type that is used as separator for concatenated strings. Dieser kann ein Literal oder eine Variable sein.It can be literal or variable.

<order_clause><order_clause>
Geben Sie mithilfe der WITHIN GROUP-Klausel optional die Reihenfolge der verketteten Ergebnisse an:Optionally specify order of concatenated results using WITHIN GROUP clause:

WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

<order_by_expression_list><order_by_expression_list>

Eine Liste von nicht konstanten Ausdrücken, die für das Sortieren von Ergebnissen verwendet werden kann.A list of non-constant expressions that can be used for sorting results. Nur ein order_by_expression-Element ist pro Abfrage zulässig.Only one order_by_expression is allowed per query. Standardmäßig wird die Sortierung in aufsteigender Reihenfolge vorgenommen.The default sort order is ascending.

RückgabetypenReturn Types

Der Rückgabetyp hängt vom ersten Argument (Ausdruck) ab.Return type is depends on first argument (expression). Wenn das Eingabeargument ein Zeichenfolgentyp (NVARCHAR, VARCHAR) ist, entspricht der Ergebnistyp dem Eingabetyp.If input argument is string type (NVARCHAR, VARCHAR), result type will be same as input type. In der folgenden Tabelle werden die automatischen Konvertierungen aufgeführt:The following table lists automatic conversions:

Typ des EingabeausdrucksInput expression type ErgebnisResult
NVARCHAR(MAX)NVARCHAR(MAX) NVARCHAR(MAX)NVARCHAR(MAX)
VARCHAR(MAX)VARCHAR(MAX) VARCHAR(MAX)VARCHAR(MAX)
NVARCHAR(1…4000)NVARCHAR(1…4000) NVARCHAR(4000)NVARCHAR(4000)
VARCHAR(1…8000)VARCHAR(1…8000) VARCHAR(8000)VARCHAR(8000)
int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, smallmoney, money, datetime, datetime2int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, smallmoney, money, datetime, datetime2, NVARCHAR(4000)NVARCHAR(4000)

RemarksRemarks

Bei STRING_AGG handelt es sich um eine Aggregatfunktion, die alle Ausdrücke aus Zeilen zu einer einzelnen Zeichenfolge verkettet.STRING_AGG is an aggregate function that takes all expressions from rows and concatenates them into a single string. Ausdruckswerte werden implizit in Zeichenfolgentypen konvertiert und dann verkettet.Expression values are implicitly converted to string types and then concatenated. Die implizite Konvertierung in Zeichenfolgen erfolgt basierend auf den vorhandenen Regeln für Datentypkonvertierungen.The implicit conversion to strings follows the existing rules for data type conversions. Weitere Informationen zu Datentypkonvertierungen finden Sie unter CAST und CONVERT (Transact-SQL).For more information about data type conversions, see CAST and CONVERT (Transact-SQL).

Wenn der Eingabeausdruck den Typ VARCHAR aufweist, kann das Trennzeichen nicht vom Typ NVARCHAR sein.If the input expression is type VARCHAR, the separator cannot be type NVARCHAR.

NULL-Werte werden ignoriert, und das entsprechende Trennzeichen wird nicht hinzugefügt.Null values are ignored and the corresponding separator is not added. Verwenden Sie wie in Beispiel B dargestellt die ISNULL-Funktion, um einen Platzhalter für NULL-Werte zurückzugeben.To return a place holder for null values, use the ISNULL function as demonstrated in example B.

STRING_AGG ist in jedem Kompatibilitätsgrad verfügbar.STRING_AGG is available in any compatibility level.

BeispieleExamples

A.A. Generieren einer Liste von Namen, die in neuen Zeilen getrennt sindGenerate list of names separated in new lines

Im folgenden Beispiel wird eine Liste von Namen in einer einzelnen Ergebniszelle erstellt, die mit Wagenrückläufen getrennt sind.The following example produces a list of names in a single result cell, separated with carriage returns.

SELECT STRING_AGG (FirstName, CHAR(13)) AS csv 
FROM Person.Person; 

Im Folgenden finden Sie das Resultset.Here is the result set.

csvcsv
SyedSyed
CatherineCatherine
KimKim
KimKim
KimKim
HazemHazem
......

NULL-Werte, die in name-Zellen gefunden werden, werden im Ergebnis nicht zurückgegeben.NULL values found in name cells are not returned in result.

Hinweis

Wenn Sie den Abfrage-Editor von Management Studio verwenden, kann die Option Ergebnisse in Raster den Wagenrücklauf nicht implementieren.If using the Management Studio Query Editor, the Results to Grid option cannot implement the carriage return. Wechseln Sie zu Ergebnisse in Text, um das Resultset ordnungsgemäß anzuzeigen.Switch to Results to Text to see the result set properly.

B.B. Generieren einer Liste von Namen ohne NULL-Werte, die mit Trennzeichen getrennt istGenerate list of names separated with comma without NULL values

Im folgenden Beispiel werden NULL-Werte durch „N/A“ ersetzt. Weiterhin werden die Namen durch Trennzeichen getrennt in einer einzelnen Ergebniszelle zurückgegeben.The following example replaces null values with 'N/A' and returns the names separated by commas in a single result cell.

SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv 
FROM Person.Person; 

Im Folgenden finden Sie das Resultset.Here is the result set.

CSVCsv
John,N/A,Mike,Peter,N/A,N/A,Alice,BobJohn,N/A,Mike,Peter,N/A,N/A,Alice,Bob

C.C. Generieren von durch Trennzeichen getrennten WertenGenerate comma-separated values

SELECT 
STRING_AGG(CONCAT(FirstName, ' ', LastName, ' (', ModifiedDate, ')'), CHAR(13)) 
  AS names 
FROM Person.Person; 

Im Folgenden finden Sie das Resultset.Here is the result set.

Namennames
Ken Sánchez (Feb 8 2003 12:00AM)Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (Feb 24 2002 12:00AM)Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (Dec 5 2001 12:00AM)Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (Dec 29 2001 12:00AM)Rob Walters (Dec 29 2001 12:00AM)
......

Hinweis

Wenn Sie den Abfrage-Editor von Management Studio verwenden, kann die Option Ergebnisse in Raster den Wagenrücklauf nicht implementieren.If using the Management Studio Query Editor, the Results to Grid option cannot implement the carriage return. Wechseln Sie zu Ergebnisse in Text, um das Resultset ordnungsgemäß anzuzeigen.Switch to Results to Text to see the result set properly.

Artikel und Tags werden in unterschiedliche Tabellen aufgeteilt.Article and their tags are separated into different tables. Der Entwickler möchte eine Zeile mit allen zugehörigen Tags pro Artikel zurückgeben.Developer wants to return one row per each article with all associated tags. Dafür wird folgende Abfrage verwendet:Using following query:

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;

Im Folgenden finden Sie das Resultset.Here is the result set.

articleIdarticleId titletitle Transpondertags
172172 Umfragen deuten auf knappe Wahlergebnisse hinPolls indicate close election results politics,polls,city councilpolitics,polls,city council
176176 Neue Autobahn soll Überlastung reduzierenNew highway expected to reduce congestion NULLNULL
177177 Hunde sind weiterhin beliebter als KatzenDogs continue to be more popular than cats polls,animalspolls,animals

E.E. Generieren einer Liste von E-Mails pro StadtGenerate list of emails per towns

Die folgende Abfrage sucht die E-Mail-Adressen der Angestellten und gruppiert diese nach Städten:The following query finds the email addresses of employees and groups them by towns:

SELECT town, STRING_AGG (email, ';') AS emails 
FROM dbo.Employee 
GROUP BY town; 

Im Folgenden finden Sie das Resultset.Here is the result set.

Stadttown E-Mail-Adresseemails
SeattleSeattle syed0@adventure-works.com;catherine0@adventure-works.com;kim2@adventure-works.comsyed0@adventure-works.com;catherine0@adventure-works.com;kim2@adventure-works.com
LALA sam1@adventure-works.com;hazem0@adventure-works.comsam1@adventure-works.com;hazem0@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.Emails returned in the emails column can be directly used to send emails to group of people working in some particular towns.

F.F. Generieren einer sortierten Liste von E-Mails pro StadtGenerate a sorted list of emails per towns

Ä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:Similar to previous example, the following query finds the email addresses of employees, groups them by town, and sorts the emails alphabetically:

SELECT town, 
    STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails 
FROM dbo.Employee 
GROUP BY town; 

Im Folgenden finden Sie das Resultset.Here is the result set.

Stadttown E-Mail-Adresseemails
SeattleSeattle catherine0@adventure-works.com;kim2@adventure-works.com;syed0@adventure-works.comcatherine0@adventure-works.com;kim2@adventure-works.com;syed0@adventure-works.com
LALA hazem0@adventure-works.com;sam1@adventure-works.comhazem0@adventure-works.com;sam1@adventure-works.com

Weitere Informationen finden Sie unterSee Also

CONCAT (Transact-SQL)CONCAT (Transact-SQL)
CONCAT_WS (Transact-SQL)CONCAT_WS (Transact-SQL)
FORMATMESSAGE (Transact-SQL)FORMATMESSAGE (Transact-SQL)
QUOTENAME (Transact-SQL)QUOTENAME (Transact-SQL)
REPLACE (Transact-SQL)REPLACE (Transact-SQL)
REVERSE (Transact-SQL)REVERSE (Transact-SQL)
STRING_ESCAPE (Transact-SQL)STRING_ESCAPE (Transact-SQL)
STUFF (Transact-SQL)STUFF (Transact-SQL)
TRANSLATE (Transact-SQL)TRANSLATE (Transact-SQL)
Aggregate Functions (Transact-SQL) (Aggregatfunktionen (Transact-SQL))Aggregate Functions (Transact-SQL)
String Functions (Transact-SQL) (Zeichenfolgenfunktionen (Transact-SQL))String Functions (Transact-SQL)