Problema: ¿Existe una forma de concatenar diferentes tipos de datos en TSQL que no requiera convertir todo al mismo tipo de dato?
Solución: TSQL proporciona 2 formas de concatenar datos, el signo + y la nueva función CONCAT(). Esta publicación del blog cubrirá las diferencias entre ambas, para que puedas lograr el comportamiento esperado en tu código.
La forma en que la mayoría de nosotros estamos acostumbrados a concatenar datos es usando el signo +. Sin embargo, el problema que encontramos al usar este método es que espera que los diferentes elementos que se concatenan sean del mismo tipo de dato. Si no son del mismo tipo de dato, debes realizar una conversión explícita.
Por ejemplo, supongamos que queremos concatenar un INT y una cadena:
DECLARE @intVal INT = 10
DECLARE @stringVal VARCHAR(10) = 'Hola'
SELECT @intVal + @stringVal -- Error: SQL no puede manejar diferentes tipos de datos
En el ejemplo anterior, SQL Server arroja un error porque no puede manejar los diferentes tipos de datos. Sin embargo, la nueva función CONCAT() realiza una conversión implícita a cadena para todos los elementos que se concatenan juntos.
Aquí tienes un ejemplo usando la función CONCAT():
DECLARE @intVal INT = 10
DECLARE @stringVal VARCHAR(10) = 'Hola'
SELECT CONCAT(@intVal, @stringVal) -- Conversión implícita a cadena
La función CONCAT() realiza una conversión implícita a cadena para todos los elementos que se concatenan juntos, lo que permite que el código se ejecute sin errores.
Alternativamente, puedes optar por realizar una conversión explícita al usar el método + para la concatenación:
DECLARE @intVal INT = 10
DECLARE @stringVal VARCHAR(10) = 'Hola'
SELECT CAST(@intVal AS VARCHAR) + @stringVal -- Conversión explícita a cadena
Ahora, consideremos la concatenación de un DATETIME con una cadena:
DECLARE @datetimeVal DATETIME = GETDATE()
DECLARE @stringVal VARCHAR(10) = 'Hoy es '
SELECT @datetimeVal + @stringVal -- Error: No se puede concatenar una cadena con un DATETIME
En el ejemplo anterior, usar el método + para la concatenación da un error porque no se puede concatenar una cadena con un DATETIME. Sin embargo, al usar la función CONCAT(), ocurrirá una conversión implícita y permitirá que el código se ejecute sin errores:
DECLARE @datetimeVal DATETIME = GETDATE()
DECLARE @stringVal VARCHAR(10) = 'Hoy es '
SELECT CONCAT(@datetimeVal, @stringVal) -- Conversión implícita a cadena
En resumen, la función CONCAT() realiza una conversión implícita de todo a una cadena antes de concatenarlo y devolver el resultado. Por otro lado, el método + para la concatenación realizará una conversión implícita solo entre tipos de datos de cadena. Si los tipos de datos no son del mismo tipo, se debe realizar una conversión explícita para lograr un resultado exitoso.