データベース千夜一夜第24回

SQLと関数~変換関数、IS関数、その他の関数と命令 長谷川裕行
有限会社 手國堂

その他の関数と命令

処理された行数を知るシステム関数@@ROWCOUNT、メッセージを表示するPRINTと条件によって処理を切り替えるIF命令を紹介しておきます。


- 処理された行数を知る~@@ROWCOUNT -

機能:直前に実行した命令で影響を受けたレコード数を返します。

書式:@@ROWCOUNT

引数:なし

戻り値:int型

例)テーブル「得意先_mr」の中で「住所2」フィールドに値が保持されている(NULLではない)レコードを抽出した後、何件のレコードが抽出されたかを調べます。

  SELECT お客様ID, 氏名, 住所1, 住所2
  FROM 得意先_mr
  WHERE 住所2 IS NOT NULL
  --------
  SELECT @@ROWCOUNT AS 処理件数


ROWCOUNT_BIG関数も、同じ書式で同じ結果を得ることができます。@@ROWCOUNT関数との違いは戻り値がbigint型である点だけです。従って戻り値はありません。


- メッセージを表示~PRINT -

関数ではなくSQL Server(Transact-SQL)に組み込まれたSQL命令です。

機能:クライアントに文字列を返します。

書式:PRINT <文字列>

引数:' 'で囲んだ文字列、文字列を返す関数や式など。


- 条件判断と分岐~IF...ELSE -

関数ではなくSQL Server(Transact-SQL)に組み込まれたSQL命令です。

機能:式の結果が真(TRUE)なら続く処理を実行し、そうでなければELSEに続く式を実行します。ELSE以降は省略できます。

書式
  IF <式>
   { <処理1> }
  ELSE
   { <処理2> }

引数
 <式>:論理値(TRUEまたはFALSE)を返す式。SELECT文を用いるときは、全体を( )で囲みます。
 <処理1>:<式>がTRUEのとき実行したい処理。
 <処理2>:<式>がFALSEのとき実行したい処理。

例)商品ID=13961(クリスタル置時計)の在庫が100以上あれば「在庫過剰です!」と表示します。
  IF (SELECT 在庫 FROM 在庫_mr WHERE 商品ID=13961) >=100
   PRINT '在庫過剰です!'

PRINTやIF~ELSEなどの命令は、アプリケーションのソースから直接利用するより、ストアド・プロシージャとしてデータベース側に保存する共通処理の中で使用することが多くなります。

これらの他にもCASEやFOR、WHILEなどの制御命令が用意されているので、ストアド・プロシージャの説明の回に併せて詳しく紹介することにします。


あとがき

SQLで用いることのできる主な関数を紹介してきました。関数には、集計関数のように目的が明確なものの他、様々なSQL文でフィールドの値を加工するために使うもの、本文で何度も述べたようにストアド・プロシージャ内で用いて本領を発揮するものなど、いろいろな役割があります。

説明だけで関数の機能を理解できないときには、クエリアナライザで例に示した関数の引数を部分的に書き換えて結果を比較するなど、自分で実際に動作を試してみるのが一番です。

なお、SQLで使える関数と同じ働きや似たような働きをする関数が、Visual BasicやC++などのプログラミング言語にも用意されています。場合によっては、どちらを使っても同じ結果を得られることもあります。

両者の違いは、処理の負荷がデータベース・サーバーとクライアントのどちらにかかるかです。SQL関数はデータベース・エンジンの側で処理されて結果がクライアントに返りますが、プログラミング言語の関数はアプリケーションを実行しているクライアントの側で処理されます(ここで言うクライアントはデータベース・サーバーに対して処理を要求するコンピュータ──データベース・クライアントを指します。Webサーバーやアプリケーションサーバーもデータベース・クライアントとなります)。

一般に、データベース内のデータをそのままテキストボックスやグリッドなどアプリケーションのユーザーインタフェースを使って表示する場合には、SQL関数を使った方が効率的です。データベースから値を取り出して変数に格納し、アプリケーション内の続く処理で利用するような場合には、プログラミング言語の関数を使うことになります。


Downloadサンプルファイル (LZH形式 0.98KB)



トップページ
変換関数
IS関数
その他の関数と命令
処理された行数を知る~@@ROWCOUNT
メッセージを表示~PRINT
条件判断と分岐~IF...ELSE
あとがき
Copyright © MESCIUS inc. All rights reserved.