CONCAT_WS (Transact-SQL)

Se aplica a: SQL Server 2017 (14.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento de Microsoft Fabric

Esta función devuelve una cadena resultante de la concatenación, o la combinación, de dos o más valores de cadena de una manera integral. Separa esos valores de cadena concatenados con el delimitador especificado en el primer argumento de función. (CONCAT_WS indica concatenar con separador).

Sintaxis

CONCAT_WS ( separator , argument1 , argument2 [ , argumentN ] ... )

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulta la Documentación de versiones anteriores.

Argumentos

separator

Es una expresión de cualquier tipo de carácter (char, nchar, nvarchar o varchar).

argument1, argument2 [ , argumentN ]

Expresión de cualquier valor de cadena. La función CONCAT_WS requiere al menos dos argumentos y no más de 254 argumentos.

Tipos de valores devueltos

Un valor de cadena cuya longitud y tipo dependen de la entrada.

Observaciones

CONCAT_WS toma un número variable de argumentos de cadena y los concatena (o combina) en una sola cadena. Separa esos valores de cadena concatenados con el delimitador especificado en el primer argumento de función. CONCAT_WS requiere un argumento separador y un mínimo de otros dos argumentos de valor de cadena; de lo contrario, CONCAT_WS genera un error. CONCAT_WS convierte implícitamente todos los argumentos en tipos de cadena antes de la concatenación.

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 tipo de datos y comportamiento, consulte CONCAT (Transact-SQL).

Tratamiento de valores NULL

CONCAT_WS omite el valor SET CONCAT_NULL_YIELDS_NULL { ON | OFF }.

Si CONCAT_WS recibe argumentos en los que todos los valores son NULL, devuelve una cadena vacía de tipo varchar(1).

CONCAT_WS omite los valores NULL durante la concatenación y no se agrega el separador entre ellos. Por lo tanto, CONCAT_WS puede tratar limpiamente la concatenación de cadenas que podrían tener valores "en blanco"; por ejemplo, un segundo campo de dirección. Para obtener más información, vea el ejemplo B.

Si un escenario implica valores nulos separados por un delimitador, considere la función ISNULL. Para obtener más información, vea el ejemplo C.

Ejemplos

A Concatenar valores con separador

En este ejemplo se concatenan tres columnas de la tabla sys.databases separando los valores con un guion entre espacios (-).

SELECT CONCAT_WS(' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;

El conjunto de resultados es el siguiente:

DatabaseInfo
-----------------
1 - SIMPLE - NONE
2 - SIMPLE - NONE
3 - FULL - NONE
4 - SIMPLE - NONE

B. Omitir valores NULL

En este ejemplo se omiten los valores NULL de la lista de argumentos y se usa un valor separador de comas (,).

SELECT CONCAT_WS(',', '1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;

El conjunto de resultados es el siguiente:

Address
--------------------------------
1 Microsoft Way,Redmond,WA,98052

C. Generación de datos con formato CSV a partir de la tabla

En este ejemplo se utiliza una coma como separador (,) y se agrega el carácter de retorno de carro CHAR(13) en el formato de valores separados de la columna del conjunto de resultados.

SELECT STRING_AGG(CONCAT_WS(',', database_id, recovery_model_desc, containment_desc), CHAR(13)) AS DatabaseInfo
FROM sys.databases;

El conjunto de resultados es el siguiente:

DatabaseInfo
-------------
1,SIMPLE,NONE
2,SIMPLE,NONE
3,FULL,NONE
4,SIMPLE,NONE

CONCAT_WS omite los valores NULL de las columnas. Encapsule una columna con valores NULL con la función ISNULL y proporcione un valor predeterminado. Por ejemplo:

SELECT STRING_AGG(
    CONCAT_WS(',', database_id, ISNULL(recovery_model_desc, ''),
    ISNULL(containment_desc, 'N/A')
    ), CHAR(13)) AS DatabaseInfo
FROM sys.databases;