|| (Concatenación de cadenas) (Transact-SQL)

Se aplica a: Azure SQL Database

El || operador de canalizaciones de una expresión de cadena concatena dos o más caracteres o cadenas binarias, columnas o una combinación de cadenas y nombres de columna en una expresión (un operador de cadena). Por ejemplo, SELECT 'SQL ' || 'Server'; devuelve SQL Server.

Convenciones de sintaxis de Transact-SQL

Sintaxis

expression || expression

Argumentos

expression

Cualquier expresión válida de cualquiera de los tipos de datos de la categoría de tipos de datos binarios y caracteres, excepto los tipos de datos xml, json, image, ntext o text. Ambas expresiones deben ser del mismo tipo de datos o una se debe poder convertir implícitamente en el tipo de datos de la otra.

Tipos de valores devueltos

Devuelve el tipo de datos del argumento con la mayor prioridad. Para obtener más información, consulte Precedencia de tipos de datos.

Comentarios

Si el resultado de la concatenación de cadenas es superior al límite de 8.000 bytes, el resultado se trunca. Sin embargo, si al menos una de las cadenas concatenadas es un tipo de valor grande, no se produce el truncamiento.

Cadenas y caracteres de longitud cero

El || operador (concatenación de cadenas) se comporta de forma diferente cuando funciona con una cadena vacía de longitud cero que cuando funciona con NULLvalores , o desconocidos. Se puede especificar una cadena de caracteres de longitud cero como dos comillas simples sin caracteres incluidos entre las comillas. Se puede especificar una cadena binaria de longitud cero como 0x sin ningún valor de byte especificado en la constante hexadecimal. La concatenación de una cadena de longitud cero siempre concatena las dos cadenas especificadas.

Concatenación de valores NULL

Al igual que con las operaciones aritméticas que se realizan en NULL valores, cuando se agrega un NULL valor a un valor conocido, el resultado suele ser un NULL valor. Una operación de concatenación de cadenas realizada con un NULL valor también debe generar un NULL resultado.

El || operador no respeta la SET CONCAT_NULL_YIELDS_NULL opción y siempre se comporta como si el comportamiento de ANSI SQL está habilitado, lo que produce NULL si alguna de las entradas es NULL. Esta es la diferencia principal en el comportamiento entre los operadores de + concatenación y || . Para más información, consulte SET CONCAT_NULL_YIELDS_NULL.

Uso de CAST y CONVERT cuando sea necesario

Debe utilizarse una conversión explícita a datos caracteres cuando se concatenan cadenas binarias y cualesquiera caracteres entre las cadenas binarias.

Los ejemplos siguientes muestran cuándo CONVERTse debe usar , o CAST, con la concatenación binaria y cuando CONVERTno es necesario usar , o CAST.

En este ejemplo, no se requiere ninguna CONVERT función o CAST porque en este ejemplo se concatenan dos cadenas binarias.

DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5);

SET @mybin1 = 0xFF;
SET @mybin2 = 0xA5;

-- No CONVERT or CAST function is required because this example
-- concatenates two binary strings.
SELECT @mybin1 || @mybin2

En este ejemplo, se requiere una CONVERT función o CAST porque en este ejemplo se concatenan dos cadenas binarias más un espacio.

DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5);

SET @mybin1 = 0xFF;
SET @mybin2 = 0xA5;

-- A CONVERT or CAST function is required because this example
-- concatenates two binary strings plus a space.
SELECT CONVERT(VARCHAR(5), @mybin1) || ' '
    || CONVERT(VARCHAR(5), @mybin2);

-- Here is the same conversion using CAST.
SELECT CAST(@mybin1 AS VARCHAR(5)) || ' '
    || CAST(@mybin2 AS VARCHAR(5));

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

A Uso de la concatenación de cadenas

En el ejemplo siguiente se crea una sola columna bajo el encabezado Name de columna de varias columnas de caracteres, con el nombre de familia (LastName) de la persona seguida de una coma, un único espacio y, a continuación, el nombre (FirstName) de la persona. El conjunto de resultados está en orden ascendente alfabético por el nombre de familia y, a continuación, por el nombre.

SELECT (LastName || ', ' || FirstName) AS Name
FROM Person.Person
ORDER BY LastName ASC, FirstName ASC;

B. Combinar tipos de datos numéricos y de fecha

En el siguiente ejemplo se usa la función CONVERT para concatenar los tipos de datos numeric y date.

SELECT 'The order is due on ' || CONVERT(VARCHAR(12), DueDate, 101)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID = 50001;
GO

Este es el conjunto de resultados.

------------------------------------------------
The order is due on 04/23/2007

C. Uso de varias concatenaciones de cadenas

En el ejemplo siguiente se concatenan varias cadenas para formar una cadena larga para mostrar el nombre de familia y la primera inicial de los vicepresidentes en Adventure Works Cycles. Una coma se agrega después del nombre de familia y un punto después de la primera inicial.

SELECT (LastName || ',' + SPACE(1) || SUBSTRING(FirstName, 1, 1) || '.') AS Name, e.JobTitle
FROM Person.Person AS p
    JOIN HumanResources.Employee AS e
    ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle LIKE 'Vice%'
ORDER BY LastName ASC;
GO

Este es el conjunto de resultados.

Name               Title
-------------      ---------------`
Duffy, T.          Vice President of Engineering
Hamilton, J.       Vice President of Production
Welcker, B.        Vice President of Sales

D. Uso de cadenas grandes en concatenación

En el siguiente ejemplo se concatenan varias cadenas para formar una cadena larga y, luego, se intenta calcular la longitud de la cadena final. La longitud final del conjunto de resultados es de 16 000, ya que la evaluación de expresiones comienza desde la izquierda, es decir, @x@y + @z + => (@x + @z) + . @y En este caso, el resultado de (@x + @z) se trunca a 8000 bytes y, a continuación @y , se agrega al conjunto de resultados, lo que hace que la longitud final de la cadena sea de 16 000. Dado que @y es una cadena de tipo de valor grande, no se produce el truncamiento.

DECLARE @x VARCHAR(8000) = REPLICATE('x', 8000);
DECLARE @y VARCHAR(MAX) = REPLICATE('y', 8000);
DECLARE @z VARCHAR(8000) = REPLICATE('z', 8000);

SET @y = @x || @z || @y;

-- The result of following select is 16000
SELECT LEN(@y) AS y;
GO

Este es el conjunto de resultados.

y
-------
16000