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

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Concatena los valores de expresiones de cadena y coloca valores de separador entre ellos.Concatenates the values of string expressions and places separator values between them. El separador no se agrega al final de la cadena.The separator is not added at the end of string.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

STRING_AGG ( expression, separator ) [ <order_clause> ]

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

ArgumentosArguments

expressionexpression
Es una expresión de cualquier tipo.Is an expression of any type. Las expresiones se convierten en tipos NVARCHAR o VARCHAR durante la concatenación.Expressions are converted to NVARCHAR or VARCHAR types during concatenation. Los tipos que no son de cadena se convierten en NVARCHAR.Non-string types are converted to NVARCHAR type.

separatorseparator
Es una expresión de tipo NVARCHAR o VARCHAR que se usa como separador de cadenas concatenadas.Is an expression of NVARCHAR or VARCHAR type that is used as separator for concatenated strings. Puede ser un literal o una variable.It can be literal or variable.

<order_clause><order_clause>
Si quiere, especifique el orden de los resultados concatenados con la cláusula WITHIN GROUP: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>

Lista de expresiones no constantes que se pueden usar para ordenar los resultados.A list of non-constant expressions that can be used for sorting results. Solo se permite un parámetro order_by_expression por consulta.Only one order_by_expression is allowed per query. El criterio de ordenación predeterminado es ascendente.The default sort order is ascending.

Tipos devueltosReturn Types

El tipo de valor devuelto depende del primer argumento (expression).Return type is depends on first argument (expression). Si el argumento de entrada es de tipo string (NVARCHAR, VARCHAR), el tipo del resultado será igual que el tipo de la entrada.If input argument is string type (NVARCHAR, VARCHAR), result type will be same as input type. En la siguiente tabla se enumeran las conversiones automáticas:The following table lists automatic conversions:

Tipo de expresión de entradaInput expression type ResultadoResult
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)

NotasRemarks

STRING_AGG es una función de agregado que toma todas las expresiones de las filas y las concatena en una sola cadena.STRING_AGG is an aggregate function that takes all expressions from rows and concatenates them into a single string. Los valores de la expresión se convierten implícitamente a tipos string y, después, se concatenan.Expression values are implicitly converted to string types and then concatenated. La conversión implícita de cadenas sigue las reglas existentes para las conversiones de tipos de datos.The implicit conversion to strings follows the existing rules for data type conversions. Para más información sobre las conversiones de tipo de datos, vea CAST y CONVERT (Transact-SQL).For more information about data type conversions, see CAST and CONVERT (Transact-SQL).

Si la expresión de entrada es de tipo VARCHAR, el separador no puede ser de tipo NVARCHAR.If the input expression is type VARCHAR, the separator cannot be type NVARCHAR.

Los valores NULL se omiten y no se agrega el separador correspondiente.Null values are ignored and the corresponding separator is not added. Para devolver un marcador de posición para valores NULL, use la función ISNULL como se muestra en el ejemplo B.To return a place holder for null values, use the ISNULL function as demonstrated in example B.

STRING_AGG está disponible en cualquier nivel de compatibilidad.STRING_AGG is available in any compatibility level.

EjemplosExamples

A.A. Generar una lista de nombres separados en líneas nuevasGenerate list of names separated in new lines

En el siguiente ejemplo se genera una lista de nombres en una única celda de resultados separados por retornos de carro.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; 

El conjunto de resultados es el siguiente.Here is the result set.

csvcsv
SyedSyed
CatherineCatherine
KimKim
KimKim
KimKim
HazemHazem
...

Loa valores NULL detectados en las celdas name no se incluyen en el resultado.NULL values found in name cells are not returned in result.

Nota

Si usa el Editor de consultas de Management Studio, la opción Resultados a cuadrícula no puede implementar el retorno de carro.If using the Management Studio Query Editor, the Results to Grid option cannot implement the carriage return. Cambie a Resultados a texto para ver el resultado configurado correctamente.Switch to Results to Text to see the result set properly.

B.B. Generar una lista de nombres separados por coma sin valores NULLGenerate list of names separated with comma without NULL values

En el siguiente ejemplo los valores NULL se reemplazan por "N/A" y se devuelven los nombres separados por comas en una única celda de resultados.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; 

El conjunto de resultados es el siguiente.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. Generar nombres separados por comasGenerate comma-separated values

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

El conjunto de resultados es el siguiente.Here is the result set.

nombresnames
Ken Sánchez (8 de febrero de 2003 12:00 A.M.)Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (24 de febrero de 2002 12:00 A.M.)Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (5 de diciembre de 2001 12:00 A.M.)Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (29 de diciembre de 2001 12:00 A.M.)Rob Walters (Dec 29 2001 12:00AM)
...

Nota

Si usa el Editor de consultas de Management Studio, la opción Resultados a cuadrícula no puede implementar el retorno de carro.If using the Management Studio Query Editor, the Results to Grid option cannot implement the carriage return. Cambie a Resultados a texto para ver el resultado configurado correctamente.Switch to Results to Text to see the result set properly.

Los artículos y sus etiquetas están divididos en tablas diferentes.Article and their tags are separated into different tables. El desarrollador quiere que se devuelva una fila por cada artículo con todas las etiquetas asociadas.Developer wants to return one row per each article with all associated tags. Si se usa la siguiente consulta: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;

El conjunto de resultados es el siguiente.Here is the result set.

articleIdarticleId titletitle etiquetastags
172172 Los sondeos vaticinan unos resultados electorales ajustadosPolls indicate close election results política,sondeos,ayuntamientopolitics,polls,city council
176176 Se espera que la nueva autopista reduzca la congestiónNew highway expected to reduce congestion NULLNULL
177177 Los perros siguen siendo más populares que los gatosDogs continue to be more popular than cats sondeos,animalespolls,animals

Nota

La cláusula GROUP BY es necesaria si la función STRING_AGG no es el único elemento de la lista SELECT.The GROUP BY clause is required if the STRING_AGG function isn't the only item in the SELECT list.

E.E. Generar una lista de correos electrónicos por ciudadesGenerate list of emails per towns

Con la siguiente consulta se buscan las direcciones de correo electrónico de los empleados y se las agrupa por ciudades: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; 

El conjunto de resultados es el siguiente.Here is the result set.

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

F.F. Generar una lista ordenada de correos electrónicos por ciudadesGenerate a sorted list of emails per towns

Al igual que el ejemplo anterior, con la siguiente consulta se buscan las direcciones de correo electrónico de los empleados, se las agrupa por ciudad y se ordenan alfabéticamente: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; 

El conjunto de resultados es el siguiente.Here is the result set.

towntown emailsemails
SeattleSeattle catherine0@adventure-works.com;kim2@adventure-works.com;syed0@adventure-works.comcatherine0@adventure-works.com;kim2@adventure-works.com;syed0@adventure-works.com
Los ÁngelesLA hazem0@adventure-works.com;sam1@adventure-works.comhazem0@adventure-works.com;sam1@adventure-works.com

Vea tambiénSee 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)
Funciones de agregado (Transact-SQL)Aggregate Functions (Transact-SQL)
Funciones de cadena (Transact-SQL)String Functions (Transact-SQL)