Hasta la versión 2008 R2 de SQL Server, cuando se requería concatenar cadenas de caracteres se usaba el operador +. A partir de la versión 2012 contamos con la función CONCAT. Haciendo clic aquí podemos conocer lo que indican los libros en línea sobre esta función.
Vamos a conocer las principales diferencias entre usar el operador + y la función CONCAT, resaltando las ventajas de esta última:
1 2 3 4 |
--Ejemplo simple utilizando el operador + DECLARE @Cadena varchar(100) SET @Cadena = 'Texto 1-' + 'Texto 2-' + 'Texto 3' SELECT @Cadena AS Cadena |
Aquí el resultado:
Otro ejemplo:
1 2 3 4 |
--Ejemplo utilizando el operador +, leyendo datos de una tabla DECLARE @Cadena varchar(100) SELECT @Cadena = LastName+','+FirstName FROM person.Person WHERE BusinessEntityID=1 SELECT @Cadena AS Cadena |
Aquí el resultado:
Pero hay algunos casos en los que el operador + no hace el trabajo completo. Qué pasa si queremos concatenar un tipo de dato que no es caracter?:
1 2 3 4 |
--Ejemplo utilizando el operador + con diferentes tipos de datos DECLARE @Cadena varchar(100) SET @Cadena = 'Texto 1-' + 'Texto 2-' + 'Texto 3' + 12345 SELECT @Cadena AS Cadena |
Aquí el resultado, o mas bien, el error:
Msg 245, Level 16, State 1, Line 8
Error de conversión al convertir el valor varchar ‘Texto 1-Texto 2-Texto 3’ al tipo de datos int.
Para que esto no suceda, necesitamos aplicar funciones de conversión:
1 2 3 4 |
--Ejemplo utilizando el operador + con diferentes tipos de datos DECLARE @Cadena varchar(100) SET @Cadena = 'Texto 1-' + 'Texto 2-' + 'Texto 3-' + CAST(12345 as varchar) SELECT @Cadena AS Cadena |
Ahora sí, el resultado como se esperaba:
Otro tema a considerar cuando concatenamos datos, es el tratamiento de los nulos. En el siguiente ejemplo concatenamos varios campos. Solo uno de ellos es nulo, pero esto provoca que toda la cadena concatenada resulte nula. Para evitar eso tenemos que recurrir a la función ISNULL para controlar el resultado:
1 2 3 4 5 |
--Control de nulos con el operador + SELECT Title, Firstname, MiddleName, LastName, Title + ' ' + Firstname + ' ' + MiddleName + ' ' + LastName AS NombrecompletoNULL, ISNULL(Title,'') + ' ' + Firstname + ' ' + MiddleName + ' ' + LastName AS Nombrecompleto FROM person.Person WHERE BusinessEntityID=1 |
Este es el resultado:
Entonces, ahora veremos como podemos manejar los mismos escenarios con la función CONCAT:
1 2 |
SELECT CONCAT(Title, ' ', Firstname,' ', MiddleName,' ', LastName,' ',12345,' ', SYSDATETIME()) FROM person.Person WHERE BusinessEntityID=1 |
Veamos en el siguiente resultado utilizando la función CONCAT que no es necesario preocuparnos por los tipos de datos. Aquí hemos concatenado texto, número entero y una fecha, sin usar conversión. Además la función controla automáticamente los datos nulos, no considerándolos para el resultado final:
Estas sutiles ventajas alivian el trabajo en el diseño y programación de código en el lado del servidor. Una razón importante para considerar la migración a esta versión
Pronto publicaremos más funciones novedosas aparecidas en la versión 2012
Muchas gracias por tu ejemplo me ha servido de mucho, ya que no podía concatenar 2 variables y era porque no tenía en cuenta el NULL. Gracias!!!!!
De nada Hector, ayudar es lo que nos motiva
Saludos
Muy buen dato. Muchas Gracias.
Si quiero concatenar un campo nombre pero las primeras 5 letras y agregar de otro campo Zona las 3 primeras letras y guardarlo en otra tabla como lo hago mil gracias por su apoyo
Alonso: para tomar solo ciertas letras de un campo puedes usar las funciones LEFT, RIGHT o SUBSTRING.
Puedes almacenar la cadena en una variable para luego almacenarlo en la otra tabla. Algo así:
DECLARE @MiCadena varchar(50)
SELECT @MiCadena = CONCATENATE(LEFT(Nombre,5), LEFT(Zona,3))
FROM MiTabla01
INSERT INTO MiTabla02 (Campo01) VALUES (@MiCadena)
Espero que con esas pautas puedas resolver tu problema. Suerte!
Saludos