Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: SQL Server 2017 (14.x) e versioni
successive Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
Concatena i valori delle espressioni della stringa e inserisce i valori dei separatori tra di essi. Il separatore non viene aggiunto alla fine della stringa.
Convenzioni relative alla sintassi Transact-SQL
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Arguments
expression
Espressione di qualsiasi tipo. Le espressioni vengono convertite in tipi nvarchar o varchar durante la concatenazione. I tipi non stringa vengono convertiti in tipo nvarchar .
separator
Espressione di tipo nvarchar o varchar utilizzata come separatore per le stringhe concatenate. Può essere un valore letterale o una variabile.
<order_clause>
Facoltativamente è possibile specificare l'ordine dei risultati concatenati mediante la clausola WITHIN GROUP:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>Elenco di espressioni non costanti che possono essere utilizzate per l'ordinamento dei risultati. È consentito un solo valore
<order_by_expression_list>per query. Per impostazione predefinita, l'ordinamento è crescente.
Tipi restituiti
Il tipo restituito dipende dal primo argomento (expression). Se l'argomento di input è di tipo stringa (nvarchar, varchar), il tipo di risultato corrisponde al tipo di input. Nella tabella seguente sono elencate le conversioni automatiche:
| Tipo di espressione di input | 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, decimale, smallmoney, denaro, datatime, datetime2 |
nvarchar(4000) |
Remarks
STRING_AGG è una funzione di aggregazione che accetta tutte le espressioni dalle righe e le concatena in una stringa singola. I valori delle espressioni vengono convertiti in modo implicito nei tipi di stringa e successivamente concatenati. Per la conversione implicita in stringhe vengono seguite le regole esistenti per le conversioni dei tipi di dati. Per altre informazioni sulle conversioni dei tipi di dati, vedere CAST e CONVERT.
Se l'espressione di input è di tipo varchar, il separatore non può essere di tipo nvarchar.
I valori Null vengono ignorati e il separatore corrispondente non viene aggiunto. Per restituire un segnaposto per i valori Null, usare la ISNULL funzione come illustrato nell'esempio B.
STRING_AGG è disponibile in qualsiasi livello di compatibilità.
Note
<order_clause> è disponibile con il livello di compatibilità del database 110 e livelli superiori.
Examples
Gli esempi di codice in questo articolo usano il database di esempio AdventureWorks2025 o AdventureWorksDW2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.
A. Generare l'elenco di nomi separati in nuove righe
Nell'esempio seguente viene generato un elenco di nomi in una cella di risultato singola, separati con ritorno a capo.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Il set di risultati è il seguente.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
I valori NULL presenti nelle celle name non vengono restituiti nel risultato.
Note
Se si usa l'editor di query di SQL Server Management Studio, l'opzione Risultati in griglia non può implementare il ritorno a capo. Passare a Risultati in formato testo per visualizzare il risultato impostato correttamente. Per impostazione predefinita, i risultati in formato testo vengono troncati a 256 caratteri. Per aumentare questo limite, modificare l'opzione Numero massimo di caratteri visualizzati in ogni colonna.
B. Generare un elenco di nomi intermedi separati da virgole senza valori NULL
Nell'esempio seguente vengono sostituiti i valori con NULL e vengono restituiti N/A i nomi separati da virgole in una singola cella di risultato.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Ecco un set di risultati tagliato.
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. Generare valori delimitati da virgole
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Ecco un set di risultati tagliato.
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
Se si usa l'editor di query di SQL Server Management Studio, l'opzione Risultati in griglia non può implementare il ritorno a capo. Passare a Risultati in formato testo per visualizzare il risultato impostato correttamente. Per impostazione predefinita, i risultati in formato testo vengono troncati a 256 caratteri. Per aumentare questo limite, modificare l'opzione Numero massimo di caratteri visualizzati in ogni colonna.
D. Restituire articoli di giornale con tag correlati
Si supponga di avere un database in cui gli articoli e i relativi tag siano separati in tabelle diverse. Uno sviluppatore vuole che venga restituita una riga per ogni articolo con tutti i tag associati. La query seguente ottiene questo risultato:
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
Il set di risultati è il seguente.
| 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 clausola GROUP BY è obbligatoria se la funzione STRING_AGG non è l'unico elemento nell'elenco SELECT.
E. Generare un elenco di messaggi di posta elettronica per città
La query seguente consente di trovare gli indirizzi di posta elettronica dei dipendenti e di raggrupparli in base alla città:
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
Ecco il set di risultati tagliato.
| 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; ... |
I messaggi di posta elettronica restituiti nella colonna relativa possono essere usati per inviare messaggi di posta elettronica a un gruppo di persone che lavorano tutte nella stessa città.
F. Generare un elenco di messaggi di posta elettronica ordinato per città
La query seguente è simile alla precedente e consente di trovare gli indirizzi di posta elettronica dei dipendenti, di raggrupparli in base alla città e di metterli in ordine alfabetico:
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
Ecco il set di risultati tagliato.
| 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; ... |