Tengo un archivo CSV que estoy importando en nuestra base de datos. Una de las "columnas" contiene datos que debe ser como INT, pero algunas filas tienen números que solo se incluyen en el rango BIGINT (porque son datos de prueba de uno de nuestros socios). Almacenamos INT internamente y no deseamos cambiar.SQL - downcast con seguridad BIGINT a INT
Quiero descender con seguridad de BIGINT a INT. De forma segura, quiero decir que no se deben generar errores si ocurre un desbordamiento aritmético. Si el cast/conversion tiene éxito, quiero que mi script continúe. Si falla, quiero que se cortocircuite. Parece que no puedo entender la sintaxis adecuada. Esto es lo que tengo:
DECLARE @UserIDBigInt BIGINT = 9723021913; -- actually provided by query param
--Setting within the INT range successfully converts
--SET @UserIDBigInt = 5;
DECLARE @UserID INT = CONVERT(INT, @UserIDBigInt);
--DECLARE @UserID INT = CAST(@UserIDBigInt AS INT);
SELECT @UserIDBigInt
SELECT @UserID
IF @UserID IS NOT NULL BEGIN
SELECT 'Handle it as reliable data'
END
He pensado en comparación @UserIDBigInt al rango válido de un INT (31^-2 (-2147483648) a 2^31-1 (2147483647)), pero realmente no me gusta ese enfoque. Esa es mi alternativa. Esperaba algunas construcciones de lenguaje o funciones integradas que pudiera usar. Si tengo que comparar absolutamente con el rango válido, ¿hay al menos algunas constantes integradas (como C# int.MinValue & int.MaxValue)?
EDIT: Error corregido.
No hay constantes integradas. Si termina queriendo comparar con constantes, esa pregunta ha sido respondida antes: http://stackoverflow.com/questions/7092774/max-value-represented-by-bigint/7092844#7092844 –
¿Por qué no simplemente asignar el valor a una variable INT en su procedimiento almacenado, asigne ese valor nuevamente a una variable BIGINT, luego compare el BIGINT con el valor original (también un BIGINT).Si hubiera una asignación de desbordamiento a un INT, los valores no coincidirán. –
@Conspicuo compilador, nunca dije que estuviera usando un procedimiento almacenado. De todos modos, al hacerlo, se genera un "Error de desbordamiento aritmético que convierte la expresión a tipo de datos int". como se aludió en mi pregunta original. –