Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aplica a: SQL Server 2017 (14.x) y versiones
posteriores 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 los valores de expresiones de cadena y coloca valores de separador entre ellos. El separador no se agrega al final de la cadena.
Convenciones de sintaxis de Transact-SQL
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Arguments
expression
Expresión de cualquier tipo. Las expresiones se convierten en tipos nvarchar o varchar durante la concatenación. Los tipos que no son de cadena se convierten en tipo nvarchar .
separator
Expresión de tipo nvarchar o varchar que se usa como separador para cadenas concatenadas. Puede ser un literal o una variable.
<order_clause>
Si quiere, especifique el orden de los resultados concatenados con la cláusula WITHIN GROUP:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>Lista de expresiones no constantes que se pueden usar para ordenar los resultados. Solo se permite un parámetro
<order_by_expression_list>por consulta. El criterio de ordenación predeterminado es ascendente.
Tipos de retorno
El tipo de valor devuelto depende del primer argumento (expresión). Si el argumento de entrada es el tipo de cadena (nvarchar, varchar), el tipo de resultado es el mismo que el tipo de entrada. En la siguiente tabla se enumeran las conversiones automáticas:
| Tipo de expresión de entrada | 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, decimal, smallmoney, dinero, fecha-hora, fecha-hora2 |
nvarchar(4000) |
Remarks
STRING_AGG es una función de agregado que toma todas las expresiones de las filas y las concatena en una sola cadena. Los valores de la expresión se convierten implícitamente a tipos string y, después, se concatenan. La conversión implícita de cadenas sigue las reglas existentes para las conversiones de tipos de datos. Para obtener más información sobre las conversiones de tipos de datos, consulte CAST y CONVERT.
Si la expresión de entrada es de tipo varchar, el separador no puede ser de tipo nvarchar.
Los valores NULL se omiten y no se agrega el separador correspondiente. Para devolver un marcador de posición para valores NULL, use la ISNULL función como se muestra en el ejemplo B.
STRING_AGG está disponible en cualquier nivel de compatibilidad.
Note
<order_clause> está disponible con el nivel de compatibilidad de base de datos 110 y versiones posteriores.
Examples
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
A. Generar una lista de nombres separados en líneas nuevas
En el siguiente ejemplo se genera una lista de nombres en una única celda de resultados separados por retornos de carro.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Este es el conjunto de resultados.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
Los valores NULL detectados en las celdas name no se incluyen en el resultado.
Note
Si usa el Editor de consultas de SQL Server Management Studio, la opción Resultados a cuadrícula no puede implementar el retorno de carro. Cambie a Resultados a texto para ver el resultado configurado correctamente. De forma predeterminada, los resultados a texto se truncan a 256 caracteres. Para aumentar este límite, cambie la opción Número máximo de caracteres mostrados en cada columna.
B. Generación de una lista de nombres intermedios separados por comas sin valores NULL
En el ejemplo siguiente se reemplazan los valores por NULL y se devuelven los nombres separados N/A por comas en una sola celda de resultado.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Este es un conjunto de resultados recortado.
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. Generar nombres separados por comas
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Este es un conjunto de resultados recortado.
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 usa el Editor de consultas de SQL Server Management Studio, la opción Resultados a cuadrícula no puede implementar el retorno de carro. Cambie a Resultados a texto para ver el resultado configurado correctamente. De forma predeterminada, los resultados a texto se truncan a 256 caracteres. Para aumentar este límite, cambie la opción Número máximo de caracteres mostrados en cada columna.
D. Devolver artículos de noticias con etiquetas relacionadas
Imagine una base de datos donde los artículos y sus etiquetas se separan en tablas diferentes. Un desarrollador quiere que se devuelva una fila por cada artículo con todas las etiquetas asociadas. La consulta siguiente logra este resultado:
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
Este es el conjunto de resultados.
| 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 cláusula GROUP BY es necesaria si la función STRING_AGG no es el único elemento de la lista SELECT.
E. Generar una lista de correos electrónicos por ciudades
Con la siguiente consulta se buscan las direcciones de correo electrónico de los empleados y se agrupan por ciudad:
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
Este es el conjunto de resultados recortado.
| 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 ... |
Los correos electrónicos devueltos en la columna emails se pueden usar para enviar mensajes de correo electrónico al grupo de personas que trabajan en determinadas ciudades.
F. Generar una lista ordenada de correos electrónicos por ciudades
Al igual que el ejemplo anterior, con la siguiente consulta se buscan las direcciones de correo electrónico de los empleados, se agrupan por ciudad y se ordenan alfabéticamente:
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
Este es el conjunto de resultados recortado.
| 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 ... |
Contenido relacionado
- STRING_ESCAPE (Transact-SQL)
- COSAS (Transact-SQL)
- CONCAT (Transact-SQL)
- CONCAT_WS (Transact-SQL)
- Funciones de agregado (Transact-SQL)
- String Functions (Transact-SQL) [Funciones de cadena (Transact-SQL)]