我有一個CSV導入到我們的數據庫。其中一個「列」包含應爲爲INT的數據,但某些行的數字只落在BIGINT範圍內(因爲它們是來自我們的某個合作伙伴的測試數據)。我們在內部存儲INT並且不想改變。SQL - 安全地將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)?
編輯:更正了錯字。
有沒有內置常量。如果你最終希望與常量進行比較,那麼以前已經回答了此問題:http://stackoverflow.com/questions/7092774/max-value-represented-by-bigint/7092844#7092844 –
爲什麼不直接將值分配給存儲過程中的INT變量,將該值直接分配給BIGINT變量,然後將BIGINT與原始值(也是BIGINT)進行比較。如果分配給INT的溢出,這些值將不匹配。 –
@Conspicuous編譯器,我從來沒有說過我正在使用存儲過程。無論如何,這樣做會引發「將算術表達式轉換爲數據類型int的算術溢出錯誤」。正如我原來的問題所暗示的那樣。 –