Compartir a través de


STRING_AGG (Transact-SQL)

Aplica a: SQL Server 2017 (14.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL 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.

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