2003年9月25日
『SQL Server での 2進表記、ビットごとの演算子』
システム管理 ML での話題を紹介します。
・列をユーザグループにより制御するには
・DB復元時に「再起動チェックポイントファイル…」のエラーがログに出力される
・9 /11(木) サポート読み合わせ会報告
中心テーマ [HOWTO] SQL Server を実行しているコンピュータ間でデータベースを移動する方法
現時点で ML のメンバーでなくても、
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=3
より閲覧可能です。
ML で変数中の1ビットをフラグにする場合のビットごとの演算子について話題になりましたが、なかなか理解が難しいようです。即効的ではありませんが、参考になる連載が
ITPro にあります。
http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20020731/1/
5分で覚えるIT基礎の基礎
あなたは論理演算がわかりますか?
AND,OR,XOR,NOTの意味と使い方の総整理
http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20020610/1/
5分で覚えるIT基礎の基礎
ゼロから学ぶ2進数
コンピュータの本質を知るための必須知識をマスターしよう
SQL Server では、直接 2進数を扱うというより、 2進表記に慣れておくと間違いを減らせると思います。Books
Online の例では
B. データ変更をテストするために COLUMNS UPDATED() 句を使用する
この例では、COLUMNS_UPDATED() 句を使用して同様の結果を得ています。
CREATE TRIGGER my_trig2
ON my_table
FOR INSERT
AS
IF ( COLUMNS_UPDATED() & 2 = 2 )
PRINT 'Column b Modified'
GO
また、COLUMNS_UPDATED()の値について
実際に更新または挿入される列の整数ビットマスクです。たとえば、テーブルt1 が列 C1、C2、C3、C4、および C5 で構成されているものとします。テーブルt1
に UPDATE トリガを実行する場合、列 C2、C3、C4 がすべて更新されたかどうかを調べるには、値 14 を指定します。列
C2 だけが更新されたかどうかを調べるには、値 2 を指定します。
とあります。
文中 値 14、値 2 の意味を噛み砕くと、電卓(関数電卓モード)で 14 と入力し、10 進数から 2 進数に切り替えます。
1110
最下位ビットがテーブル内の最初の列を表しますから
C1 0
C2 1
C3 1
C4 1
C5 (0)
電卓(関数電卓モード)で 2 と入力し、10 進数から 2 進数に切り替えます。
10
最下位ビットがテーブル内の最初の列を表しますから
C1 0
C2 1
C3 (0)
C4 (0)
C5 (0)
となります。
以下条件ごとに対応する IF ( COLUMNS_UPDATED() ) を例示します。
条件 「列 C1、C2、C3、C4、C5 のうち C2、C3、C4 が更新され C1、C5 はそのまま」
=01110 なので
IF ( COLUMNS_UPDATED() = 14 )
AND (&) は、特定の列だけを着目したい場合のマスクとして用います。
条件 「列 C1、C2、C3、C4、C5 のうち C2、C3、C4 が更新され C1、C5 はどちらでもよい」の場合、01110、01111、11110、11111
のどれかとなります。この場合、まず余分な C1 、C5 をAND (&) を用いて 0 にします。
(COLUMNS_UPDATED() & 14 )
その結果について =01110 とすることで、四つの比較を一つにまとめることができます。
IF ( COLUMNS_UPDATED() & 14 = 14 )
条件 「列 C1、C2、C3、C4、C5 のうち C2、C3、C4 のどれか一つは更新されC1、C5 はどちらでもよい」
この場合、まず余分な C1 、C5 をAND (&) を用いて 0 にします。
(COLUMNS_UPDATED() & 14 )
その結果について >0 とすることができます。
IF ( COLUMNS_UPDATED() & 14 > 0)
以上何パターンか紹介しましたが、「特定のフィールドが更新されたか」だけを判定したい場合、IF UPDATE (column)を採用してビットごとの演算を回避するのもテクニックだと思います。
|