Validar conversiones antes de modificar una columna
Una tabla de carga guarda fechas y cantidades como texto. Antes de convertir las columnas o mover los datos a tablas definitivas necesitamos encontrar los valores que no cumplen el formato esperado.
Qué necesitamos distinguir
Convertir significa transformar un valor a otro tipo. El formato ISO yyyy-mm-dd expresa año, mes y día en un orden independiente de la presentación local.
Separaremos un valor ausente de uno presente pero incompatible. En este ejemplo la fecha debe utilizar el formato ISO yyyy-mm-dd y la cantidad debe convertirse a un entero positivo.
Consulta
/*
Antes de ejecutar:
Revisa la base activa, los nombres de objetos, los parámetros y los permisos.
Adapta el ejemplo a tu modelo y pruébalo primero en un ambiente controlado.
*/
SET NOCOUNT ON;
GO
-- Consulta
WITH ValoresPreparados AS
(
SELECT
mi.IdMovimientoImportado,
mi.FechaTexto,
mi.CantidadTexto,
NULLIF(TRIM(mi.FechaTexto), N'') AS FechaLimpia,
NULLIF(TRIM(mi.CantidadTexto), N'') AS CantidadLimpia
FROM dbo.MovimientoImportado AS mi
),
Conversiones AS
(
SELECT
vp.*,
TRY_CONVERT(DATE, vp.FechaLimpia, 23) AS FechaConvertida,
TRY_CONVERT(INT, vp.CantidadLimpia) AS CantidadConvertida
FROM ValoresPreparados AS vp
)
SELECT
c.IdMovimientoImportado,
c.FechaTexto,
c.FechaConvertida,
c.CantidadTexto,
c.CantidadConvertida,
CASE
WHEN c.FechaLimpia IS NULL THEN N'Fecha ausente'
WHEN c.FechaConvertida IS NULL THEN N'Fecha incompatible'
WHEN c.CantidadLimpia IS NULL THEN N'Cantidad ausente'
WHEN c.CantidadConvertida IS NULL THEN N'Cantidad incompatible'
WHEN c.CantidadConvertida <= 0 THEN N'Cantidad fuera de regla'
END AS Motivo
FROM Conversiones AS c
WHERE c.FechaLimpia IS NULL
OR c.FechaConvertida IS NULL
OR c.CantidadLimpia IS NULL
OR c.CantidadConvertida IS NULL
OR c.CantidadConvertida <= 0
ORDER BY c.IdMovimientoImportado;
GO
Parámetros o permisos
En DECIMAL, la precisión es la cantidad total de dígitos y la escala indica cuántos quedan después del separador decimal.
Cambia el tipo destino y la regla de negocio. El estilo 23 exige una fecha como 2026-09-14; utilizar un estilo explícito evita que DATEFORMAT o el idioma de la sesión interpreten de forma distinta un valor ambiguo. Para números decimales define precisión y escala, por ejemplo DECIMAL(12, 2), y revisa el separador decimal utilizado por la fuente. TRY_CAST es útil cuando no necesitas un estilo; TRY_CONVERT permite indicarlo en conversiones que lo admiten. La consulta solo lee la tabla de carga.
Cómo leer el resultado
La consulta devuelve únicamente filas que necesitan atención. Conservamos el texto original junto al valor convertido para distinguir un problema de formato de una regla funcional, como una cantidad igual a cero. TRY_CONVERT produce NULL cuando una conversión permitida no puede realizarse. Por eso primero transformamos cadenas vacías en NULL y luego conservamos indicadores separados para ausencia e incompatibilidad. Para medir el alcance antes de corregir, agrupa el resultado por Motivo o incorpora las mismas expresiones a una consulta de resumen.
Qué conclusión sí permite obtener
Permite identificar valores que no se convierten bajo tipos y formatos concretos, además de valores convertibles que incumplen una regla explícita.
Qué conclusión todavía no permite obtener
Que una conversión funcione no demuestra que el dato sea correcto. 2026-01-02 es una fecha válida, pero la consulta no sabe si la fuente quiso representar el 1 de febrero. Tampoco confirma que un cambio de tipo sea seguro: índices, restricciones, código SQL y aplicaciones pueden depender de la definición actual.
Siguiente comprobación razonable
Corrige o rechaza las filas identificadas y vuelve a ejecutar la validación. Antes de usar ALTER COLUMN, revisa dependencias, rango, precisión, nulabilidad y una estrategia de despliegue y reversión.