I have a CSV I\'m importing into our database. One of the \"columns\" contains data that should be an INT but some rows have numbers that only fall in the BIGINT ra
Cast your bigint
to varbinary
, then store the lower half to @UserID
and check the upper half:
if the upper half is all 0's and the lower half represents a non-negative value, @UserID
then contains the correct int
value;
if the upper half is all 1's and @UserID
is negative, it's all right too;
otherwise there's an arithmetic overflow.
Here's an implementation:
DECLARE @UserIDBigInt BIGINT = 9723021913;
DECLARE @UserID INT, @HighInt INT;
WITH v AS (SELECT CAST(@UserIDBigInt AS varbinary) AS bin)
SELECT
@HighInt = SUBSTRING(bin, 1, 4),
@UserID = SUBSTRING(bin, 5, 4)
FROM v;
IF (@HighInt = 0 AND @UserID >= 0 OR @HighInt = -1 AND @UserID < 0) BEGIN
SELECT 'Handle it as reliable data'
END
I'm not sure this is the best answer but it is one I came up with earlier on my own. It is possible to catch the exception/error and gracefully continue execution.
Example:
DECLARE @UserIDBigInt BIGINT = 9723021913;
DECLARE @UserID INT;
BEGIN TRY
SET @UserID = @UserIDBigInt;
END TRY BEGIN CATCH
END CATCH
IF @UserID IS NULL BEGIN
SELECT 'Handle it as unreliable data'
RETURN
END
SELECT 'Handle it as reliable data'
You could also convert the value to a string, trim it to length and convert to int. not the best way, but a safe easy way for sure
Add these to your script:
SET ARITHABORT OFF;
SET ARITHIGNORE ON;
This will convert any overflow values to NULL.
More info here: http://msdn.microsoft.com/en-us/library/ms184341.aspx