SQLServerにおけるbigint回転int符号付き時報エラーの解決方法

877 ワード

1つの要件は、1つのクラウドモニタリングのステータス値に複数のステータス(同時に存在する可能性のある様々な異常、警告ステータスを含む)を格納するために、ビット演算メカニズムを使用してint型に格納することである.
現在、モニタリング・ログ・データ量が非常に大きい(億レベル)場合、オンライン・レポートで使用するために、データを1時間ごと、毎日集約する必要があります.ステータスは、通常(0)、警告(1)、異常の3つのレベルに分けられます.(2)集約時にmaxを用いて最悪の状態を選択する必要があり,状態値の処理にレベルと状態ビット数を加える必要があり,bigint型を用いて演算を行う.
問題は、bigintをintに変更したときに元のステータス値を取得したときにSQLServerがエラーを報告したことです.
メッセージ8115、レベル16、ステータス2、1行目にexpressionをデータ型intに変換すると算術オーバーフローエラーが発生します.
ステータスコードに0 x 8000000が使用されているため、シンボルビットの問題が発生した.変換関数を書いて解決しました.

CREATE FUNCTION [dbo].[BigintToInt]

(

@Value bigint 

)

RETURNS int

AS

BEGIN

--    int   

IF @Value & 0x80000000 <> 0 RETURN @Value & 0xFFFFFFFF | 0xFFFFFFFF00000000

--     

RETURN @Value & 0xFFFFFFFF

END