Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à : SQL Server 2017 (14.x) et versions
ultérieures Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint in Microsoft Fabric
Warehouse dans Microsoft Fabric
SQL database dans Microsoft Fabric
Concatène les valeurs des expressions de chaîne et place les valeurs de séparateur entre elles. Le séparateur n’est pas ajouté à la fin de la chaîne.
Conventions de la syntaxe Transact-SQL
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Arguments
expression
Expression de n’importe quel type. Les expressions sont converties en types nvarchar ou varchar pendant la concaténation. Les types non chaînes sont convertis en type nvarchar .
separator
Expression de type nvarchar ou varchar utilisée comme séparateur pour les chaînes concaténées. Ce peut être un littéral ou une variable.
<order_clause>
Spécifiez éventuellement l’ordre des résultats concaténés à l’aide de la clause WITHIN GROUP :
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>Liste d’expressions non constantes qui peuvent être utilisées pour trier les résultats. Un seul
<order_by_expression_list>est autorisé par requête. L’ordre de tri par défaut est croissant.
Types de retour
Le type de retour dépend du premier argument (expression). Si l’argument d’entrée est de type chaîne (nvarchar, varchar), le type de résultat est identique au type d’entrée. Le tableau suivant répertorie les conversions automatiques :
| Type d’expression d’entrée | 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, décimal, smallmoney, money, datetime, datetime2 |
nvarchar(4000) |
Remarks
STRING_AGG est une fonction d’agrégation qui accepte toutes les expressions à partir des lignes et les concatène en une seule chaîne. Les valeurs d’expression sont implicitement converties en types chaîne, puis concaténées. La conversion implicite en chaînes respecte les règles existantes de conversion de type de données. Pour plus d’informations sur les conversions de types de données, consultez CAST et CONVERT.
Si l’expression d’entrée est de type varchar, le séparateur ne peut pas être de type nvarchar.
Les valeurs Null sont ignorées et le séparateur correspondant n’est pas ajouté. Pour retourner un espace réservé pour les valeurs Null, utilisez la fonction comme illustré dans l’exemple ISNULLB.
STRING_AGG est disponible dans n’importe quel niveau de compatibilité.
Note
<order_clause> est disponible avec le niveau de compatibilité de la base de données 110 et plus.
Examples
Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.
A. Générer une liste de noms séparés sur plusieurs lignes
L’exemple suivant génère une liste de noms dans une cellule de résultat unique, séparés par des retours chariot.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Voici le jeu de résultats.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
Les valeurs NULL trouvées dans les cellules name ne sont pas renvoyées dans le résultat.
Note
Si vous utilisez l’éditeur de requête SQL Server Management Studio, l’option Résultats vers grille ne peut pas implémenter le retour chariot. Basculez vers Results to Text pour afficher correctement le jeu de résultats. Les résultats dans du texte sont tronqués à 256 caractères par défaut. Pour augmenter cette limite, modifiez l’option Nombre maximal de caractères affichés dans chaque colonne.
B. Générer la liste des noms intermédiaires séparés par des virgules sans valeurs NULL
L’exemple suivant remplace les NULL valeurs N/A par et retourne les noms séparés par des virgules dans une seule cellule de résultat.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Voici un jeu de résultats réduit.
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. Générer des valeurs séparées par des virgules
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Voici un jeu de résultats réduit.
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
Si vous utilisez l’éditeur de requête SQL Server Management Studio, l’option Résultats vers grille ne peut pas implémenter le retour chariot. Basculez vers Results to Text pour afficher correctement le jeu de résultats. Les résultats dans du texte sont tronqués à 256 caractères par défaut. Pour augmenter cette limite, modifiez l’option Nombre maximal de caractères affichés dans chaque colonne.
D. Retourner des articles d’actualité avec les balises associées
Imaginez une base de données dans laquelle les articles et leurs balises sont séparés en différentes tables. Un développeur souhaite renvoyer une ligne pour chaque article avec toutes les balises associées. La requête suivante permet d’obtenir ce résultat :
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
Voici le jeu de résultats.
| 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
La clause GROUP BY est obligatoire si la fonction STRING_AGG n’est pas le seul élément de la liste SELECT.
E. Générer une liste d’adresses e-mail par ville
La requête suivante recherche les adresses e-mail des employés et les regroupe par ville :
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
Voici le jeu de résultats rogné.
| 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 ; ... |
Les adresses e-mail renvoyées dans la colonne emails peuvent être utilisées directement pour envoyer des e-mails à un groupe de personnes travaillant dans certaines villes particulières.
F. Générer une liste ordonnée d’adresses e-mail par ville
Similaire à l’exemple précédent, la requête suivante recherche les adresses e-mail des employés, les regroupe par ville, puis les trie par ordre alphabétique :
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
Voici le jeu de résultats rogné.
| 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 ; ... |