トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション



システム管理 ボードリーダー:米田 慎一

毎月第2、第4木曜日はボードリーダーからのレポートを掲載いたします。
 
   

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)を採用してビットごとの演算を回避するのもテクニックだと思います。



ボードリーダーレポート トップページへ

 

 
PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.