夏椰の東屋

- お遊び記録 -

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  108  : 記事  1  : コメント  3974  : トラックバック  30

ニュース


落書きしてね♪

IAM
僕がとった写真です。
ご自由にお使いください。

フィードメーター - 夏椰の東屋 track feed
広告


記事カテゴリ

書庫

日記カテゴリ

Other Site From Kaya

今日はテーブルに計算列を持たせ、そこにCHECK制約をつけて遊んでみました。

#ターゲットはSQLServer20005Expressです。

まずは、計算列だけを持つCREATE TABLE文です。


CREATE TABLE testProcCol 
(
 id INT, 
 padid AS REPLICATE('0',5-LEN(CAST(id AS VARCHAR))) 
    + CAST(id AS VARCHAR)
) ;

ここへINSERTを発行します。

?


insert into testProcCol values(0);

で、SELECTして結果を取得してみますと・・・

ID PADID
0 00000

となります。

?

CREATE TABLEの時にPADIDとして指定したのは

  ・REPEAT('0', 回数) →'0'の文字を回数分つなげた文字列を返す。

  ・CAST(列名 as varchar)→列名で指定されたデータをVARCHARへ変換する。

  ・LEN(文字列)→文字列の長さを取得する。

の3つです。

PADIDの長さを5として、'0'をつなげる回数は5からIDを文字列にした時の長さを引いたものになります。

それに文字列化したIDをつなげたら前0パディングされた文字列のIDが出てきます。

#後でCHECK制約が出てくるので、現状として回数がマイナス値になったらNULLになるのは省きます(--;

?

で、PADIDに対して01000~09999間での値ぢゃなきゃ嫌だ!って制約があったとします。

なので、計算列のPADIDに対してCHECK制約をかけてみます。

#IDに対して1000~9999であるCHECK制約をつけるのは簡単なので、あえて計算列のPADIDにつけます。


CREATE TABLE testProcCol 
(
 id INT, 
 padid AS REPLICATE('0',5-LEN(CAST(id AS VARCHAR))) 
    + CAST(id AS VARCHAR) PERSISTED 
 CHECK( padid IS NOT NULL AND padid LIKE '0[0-9][0-9][0-9][0-9]' )
) ;

このテーブルにデータを追加してみましょう。

?


insert into testProcCol values(0);    →OK
insert into testProcCol values(1000);  →OK
insert into testProcCol values(9999);  →OK
insert into testProcCol values(10000);  →NG(1桁目が0にならない)
insert into testProcCol values(99999);  →NG(1桁目が0にならない)
insert into testProcCol values(100000);  →NG(REPLICATEの第2引数がマイナスになる→PADIDがNULLになる)

よってSELECTで取得できるデータは以下の通りになります。

ID PADID
0 00000
1000 01000
9999 09999

チェック制約に引っかかるということはデータの更新時に

計算列の計算が行われているということに気づくと思います。

#ただし、これはチェック制約をチェックするために計算しているだけです。

?

このデータを取得する際の実行計画ですが、

以下のようになります。

実行計画

?

これを見ると、取得時に計算列が計算されていることがわかりますね。

?

ということで、遊んでみた結果を載せてみた。

うまく使うと楽になる要素が多々ありそうな気がします。

#気がするだけ?(ww

投稿日時 : 2006年12月19日 1:37

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント