¡Hola, chicos!

En este artículo me gustaría compartir contigo una pregunta que enviaste hace unos minutos en un grupo de Whatsapp sobre un problema muy común en el día a día de quienes trabajan con SQL Server, especialmente en las áreas de BI y/o desarrollo, que son los errores de conversión de tipos de datos, es decir, el intento de convertir un valor de un tipo a otro, muy común cuando los datos de origen provienen de fuentes no estructuradas como archivos CSV, JSON y de texto y todos se importan como texto (varchar/nvarchar) y se convierten a más adecuados. tipos más tarde.

¿Quién no se ha encontrado nunca con un mensaje de error como este?

Mensaje 245, Nivel 16, Estado 1, Línea 40
La conversión falló al convertir el valor varchar '1401D' al tipo de datos int.

Mensaje 241, Nivel 16, Estado 1, Línea 44
La conversión falló al convertir la fecha y/u hora de una cadena de caracteres.

Si está utilizando la versión 2005 o 2008 de SQL Server, puede utilizar las funciones ISNUMÉRICO (números enteros, reales, monedas, decimales, etc.) y fecha isda (fechas) para realizar la validación para identificar valores que son inconsistentes al encontrar un error en el intento de conversión.

Si estás utilizando la versión 2012 o superior, podrás utilizar, además de las funciones vistas anteriormente, las nuevas funciones TRY_PARSE (solo tipos numéricos y de fecha), TRY_CAST (cualquier tipo) o TRY_CONVERT (cualquier tipo, con 3 parámetros opcionales para controlar la máscara de entrada) para realizar la conversión de datos, de la forma en que la usa normalmente. La diferencia entre estas funciones es que en caso de inconsistencia durante la conversión, la función no generará un error/excepción, por el contrario, ignorará silenciosamente este error (devolviendo NULL para los casos que sean inconsistentes). Esto se puede usar tanto al mostrar resultados como en WHERE, para ayudar a identificar qué registros devolvieron NULL, es decir, que generarían un error al intentar una conversión tradicional, usando CAST/CONVERT.

Desde SQL Server 2005, también es posible validar esta información utilizando Expresiones Regulares (Regexp), como lo demostré con varios ejemplos y explicaciones en el artículo. SQL Server: cómo utilizar expresiones regulares (RegExp) en su base de datos.

Guión utilizado en el vídeo:

IF ( OBJECT_ID ( 'tempdb..#Teste' ) IS NOT NULL ) DROP TABLE #Teste
SELECT
    CAST ( BusinessEntityID AS VARCHAR ( MAX ) ) AS BusinessEntityID ,
    Title ,
    FirstName ,
    LastName ,
    rowguid ,
    CONVERT ( VARCHAR ( MAX ) , ModifiedDate , 112 ) AS ModifiedDate
INTO
    #Teste
FROM
    AdventureWorks2019.Person.Person


-- Simulando alguns erros
UPDATE #Teste
SET
    ModifiedDate = LEFT ( ModifiedDate , 7 ) + '2'
WHERE
    BusinessEntityID BETWEEN 1 AND 20
    OR BusinessEntityID BETWEEN 5000 AND 6000


UPDATE #Teste
SET
    BusinessEntityID += 'D'
WHERE
    BusinessEntityID BETWEEN 1400 AND 1450


SELECT *
FROM #Teste


SELECT *
FROM #Teste
WHERE BusinessEntityID LIKE '%D'
OR BusinessEntityID BETWEEN 1 AND 50
OR BusinessEntityID BETWEEN 5000 AND 6000



SELECT CONVERT ( INT , BusinessEntityID )
FROM #Teste


SELECT CONVERT ( DATE , ModifiedDate , 112 )
FROM #Teste


SELECT BusinessEntityID
FROM #Teste
WHERE TRY_CAST ( BusinessEntityID AS INT ) IS NULL


SELECT ModifiedDate
FROM #Teste
WHERE TRY_CONVERT ( DATE , ModifiedDate , 112 ) IS NULL


SELECT ModifiedDate , TRY_CONVERT ( DATE , ModifiedDate , 112 )
FROM #Teste


SELECT * 
FROM #Teste
WHERE ISNUMERIC ( BusinessEntityID ) = 0


SELECT * FROM #Teste
WHERE ISDATE ( ModifiedDate ) = 0

Bueno chicos, espero que hayan disfrutado de este artículo simple, pequeño pero muy objetivo que ayuda mucho a quienes recién comienzan su viaje con los datos.
¡Un abrazo grande y hasta la próxima!