¡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!
Comentários (0)
Carregando comentários…