sql >> データベース >  >> RDS >> Sqlserver

履歴を保持せずに変更されたフィールドを追跡する

    TSQL でビットフィールドを使用する方法 (更新と読み取り用)

    開始時にビットフィールドをデフォルトの 0 (変更なし) に設定します。最大 32 ビットのデータには型 int を使用し、最大 64 ビットのデータには bigint を使用する必要があります。

    ビット フィールドにビットを設定するには、| を使用します。 (ビット OR 演算子) 更新ステートメントで、たとえば

    UPDATE table 
    SET field1 = 'new value', bitfield = bitfield | 1
    
    UPDATE table 
    SET field2 = 'new value', bitfield = bitfield | 2
    

    | の後の値には、各フィールドの 2 の N-1 乗を使用します。

    ビット フィールドを読み取るには、& を使用します (ビット AND 演算子) を実行し、それが真かどうかを確認します。たとえば、

    SELECT field1, field2,
           CASE WHEN (bitfield & 1) = 1 THEN 'field1 mod' ELSE 'field1 same' END,
           CASE WHEN (bitfield & 2) = 2 THEN 'field2 mod' ELSE 'field2 same' END
    FROM table
    

    これはアプリケーションで使用されるため、おそらくテキストは使用しないことに注意してください。このようなものが機能します

    SELECT field1, field2,
            CASE WHEN (bitfield & 1) = 1 THEN 1 ELSE 0 END AS [field1flag],
            CASE WHEN (bitfield & 2) = 2 THEN 1 ELSE 0 END AS [field2flag]
    FROM table
    

    または、上記の !=0 を使用して、以下のテストで行ったように簡単にすることもできます

    エラーがないことを実際にテストする必要があります。テスト スクリプトをクリックしてください

    元の回答:

    テーブルに 16 列未満の列がある場合は、「フラグ」を整数として格納し、ビット フラグ メソッドを使用して、変更された列を示すことができます。気にしないものは無視するか、気にしないでください。

    したがって、flagfield BOOLEAN AND 2^N が true の場合、N 番目のフィールドが変更されたことを示します。

    または最大 N =2 の例

    0 - 何も変更されていません (すべてのビットが 0)

    1 - フィールド 1 が変更されました (最初のビット 1)

    2 - フィールド 2 が変更されました (2 番目のビット 1)

    3 - フィールド 1+2 が変更されました (最初と 2 番目のビット 1)

    より良い定義については、次のリンクを参照してください:http://en.wikipedia.org/wiki/Bit_field



    1. GROUP BY と ROW_NUMBER を組み合わせるには?

    2. SQL Server 2012 で TRY_CONVERT が失敗する

    3. oracle-ピボット解除クエリでNULL値をクエリする

    4. 次の SQL Server クエリが 14 か月のデータではなく 12 か月のデータを返す理由