我要将一个CSV文件导入到我们的数据库中。其中一个“列”包含应该是INT类型的数据,但有些行的数字仅限于BIGINT范围(因为它们是来自我们合作伙伴的测试数据)。我们在内部存储INT类型,不想进行更改。
我想要安全地从BIGINT转换为INT。所谓安全,就是如果发生算术溢出,不应该引发任何错误。如果转换成功,我希望我的脚本继续执行。如果失败,我希望它可以快速终止。我似乎无法找到正确的语法。这是我得到的:
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
我想过将@UserIDBigInt与INT的有效范围(-2 ^ 31(-2,147,483,648)到2 ^ 31-1(2,147,483,647))进行比较,但我真的不喜欢这种方法。那是我的备选方案。我希望有一些语言结构或内置函数可以使用。如果我绝对必须与有效范围进行比较,是否至少有一些内置常量可用(例如C#的int.MinValue和int.MaxValue)?
编辑:更正了拼写错误。
SET ARITHABORT OFF; SET ANSI_WARNINGS OFF;
。 - Martin Smithset sql_mode=''
),我原以为您已经这样做了。 - Conspicuous Compilertry_convert
,但是目前可能对你并不适用。 - Martin Smith