私は私たちのデータベースにインポートしているCSVがあります。 "列"にはがのINTであるデータが含まれていますが、一部の行にはBIGINT範囲内の数値しか含まれていないものがあります(パートナーのテストデータなので)。私たちは内部的にINTを保存し、変更する気はありません。SQL - 安全にダウンキャストBIGINT INTに
私はBIGINTからINTにダウンキャストすることを安全にしたいと思います。安全には、算術オーバーフローが発生した場合にエラーを発生させる必要はありません。キャスト/変換が成功したら、私はスクリプトを実行します。それが失敗すると、私はそれが短絡したい。私は正しい構文を理解できないようです。 、私は(2^31-1(2,147,483,647)に-2^31(-2147483648))INTの有効範囲に@UserIDBigIntを比較することについて考えてきました
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
:これは私が持っているものです私はそのアプローチが本当に好きではありません。それは私の後退です。私はいくつかの言語構造や組み込み関数が使えることを期待していました。私が絶対に有効範囲と比較する必要がある場合は、C#のint.MinValue & int.MaxValueのような組み込み定数がいくつかありますか?
EDIT:誤植が修正されました。
組み込みの定数はありません。最終的に定数と比較したい場合は、前にその質問に答えています:http://stackoverflow.com/questions/7092774/max-value-represented-by-bigint/7092844#7092844 –
ストアドプロシージャのINT変数は、その値をBIGINT変数に戻してから、BIGINTを元の値(BIGINT)と比較します。オーバーフローがINTに割り当てられると、値は一致しません。 –
@Conspicuousコンパイラ、私はストアドプロシージャを使用しているとは言いませんでした。それにかかわらず、そうすることで、式をデータ型intに変換する算術オーバーフローエラーが発生します。私の元の質問で言及されたように。 –