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

SQLと関数~数学関数とシステム関数 長谷川裕行
有限会社 手國堂

システム関数

SQL Serverで管理しているデータベース全般の状態などを調べるための関数群です。データベース全体の保守・管理作業の他、ユーザーIDやワークステーションIDなどを調査できるため、アプリケーションのレベルでユーザーやワークステーション(接続されているコンピュータ)ごとに処理を切り替えることができます。


- 値のバイト数~DATALENGTH -

機能:値に使用されているバイト数を返します。フィールド名を指定すると、そのフィールドに保存されている値のバイト数が分かります。

書式:DATALENGTH(<値>)

戻り値:int型


- ユーザー番号~USER_ID -

機能:データベース・ユーザーの識別番号(ユーザーID)を返します。

書式:USER_ID(<ユーザー名>)

引数:nchar型のユーザー名。省略すると現在操作中のユーザー名になります。

戻り値:smallint型の識別番号

例:ユーザー“hirata”に割り当てられている識別番号を調べます。

  SELECT USER_ID('hirata')


- ユーザー名~USER_NAME -

機能:ユーザーIDに対応するユーザー名を返します。

書式:USER_NAME([<ユーザーID>])

引数:int型のユーザーID。省略すると現在操作中のユーザーIDになります。

戻り値:nvarchar型(256バイト以内)の文字列

USER_ID関数とUSER_NAME関数は、システム担当者の氏名や所属などを記録するテーブルにユーザー名、ユーザーIDのフィールドを作成しておくと、「現在データベースを操作中のユーザー」に関する情報を取り出せるようになります。

さらに、そのテーブルを担当者ごとの成績や顧客リスト、スケジュールなどを記録したテーブルと関連付けておくと、ユーザーが自分に必要な情報を簡単に取り出せます。

例えば、以下のような2つのテーブルがあり、ユーザーIDを記録するUIDフィールドで関連付けられているとします。

・テーブル名:担当者
フィールド構成:UID 氏名 所属 性別

・テーブル名:予定
フィールド構成:UID 年 月 日 開始時 終了時 内容 済

以下のようなSQLを実行すれば、現在操作中のユーザー(自分自身)の未済の予定を知ることができます。

  SELECT 年, 月, 日, 内容
  FROM 予定
  WHERE UID = USER_ID() AND 済 = 0


- アプリケーション名~APP_NAME -

機能:セッション(データベースに対する操作)を実行しているアプリケーションの名前を返します。

書式:APP_NAME()

戻り値:nvarchar型(128バイト以内)の文字列

多くの場合、アプリケーションからSQLを使ってデータベースを操作します。SQLによるデータベース操作の単位をセッション(session)といい、APP_NAME関数を使ったSQL文を実行すると、そのSQL文を実行した(データベース・エンジンに対して操作を働きかけた)アプリケーションの名前が返ってきます。

例:SQLを発行したアプリケーション名を表示します。

  SELECT APP_NAME()



- ワークステーションの識別番号~HOST_ID -

機能:ワークステーションの識別番号(ワークステーションID)を返します。

書式:HOST_ID(<ホスト名>)

引数:ワークステーション名(ホスト名)を示す文字列。省略するとセッションを実行しているコンピュータの識別番号が返されます。

戻り値:char型(8バイト以内)


- ワークステーション名~HOST_NAME -

機能:ワークステーションの名前(ホスト名)を返します。

書式:HOST_NAME(<ワークステーションID>)

引数:int型のワークステーションID。省略するとセッションを実行しているコンピュータのワークステーション名が返されます。

戻り値:nchar型の文字列


- データベースID~DB_ID -

機能:データベースの識別番号(データベースID)を返します。

書式:DB_ID(<データベース名>)

引数:データベース名を示すnvarchar型の文字列。省略すると現在接続中のデータベースに対する識別番号が返ります。

戻り値:smallint型

例:すべてのデータベースとそのファイル名を一覧表示します。

  USE master
  SELECT dbid AS ID, DB_NAME(DBID) AS 名称, filename AS ファイル名
  FROM sysdatabases
  ORDER BY dbid

USEは扱うデータベースを変更する命令です。これによって操作の対象を管理用データベース「master」に切り替え、テーブル「sysdatabases」に記録されているすべてのデータベースに関する情報を引き出します。



- データベース名~DB_NAME -

機能:データベース名を返します。

書式:DB_NAME(<データベースID>)

引数:smallint型のデータベースID。省略すると現在接続中のデータベース名が返ります。

戻り値:nvarchar型の文字列(128バイト以内)


- IDフィールドの追加~IDENTITY -

機能:新規テーブルにIDフィールドを追加します。

書式:IDENTITY(<型> [ , <初期値>, <増分値>] ) AS <フィールド名>

引数
 <型>:IDフィールドの型。bit型以外の整数型またはdecimal型
 <初期値>:先頭レコードに割り当てたい値。既定値は「1」
 <増分値>:1件追加されるたびに増加したいIDの値。既定値は「1」
 <フィールド名>:フィールド名を示す文字列

戻り値:<型>で示した値と同じ型

SELECT命令のINTO table句でのみ使用できます。


- トランザクション数~@@TRANCOUNT -

機能:トランザクション(データベースに対する操作)の数を返します。

書式:@@TRANCOUNT

戻り値:int型

トランザクションはデータベースに対する操作と変更を記録しておき、場合によっては処理をさかのぼって取り消すことのできる仕組みです。

BEGIN TRANSACTION命令を実行することで、データベースを操作するたびにトランザクションは1ずつ増えていき、ROLLBACK TRANSACTION命令を実行して操作を取り消す(さかのぼる)ことで1ずつ減っていきます。

トランザクションについては、回を追って取り上げます。また、本コラムの「第8回 データの加工命令(2)~レコードの削除と削除処理の注意点」の《補足》で簡単に説明していますので、そちらも参照してください。


- エラー番号~@@ERROR -

機能:直前に実行したSQL文のエラー番号を返します。

書式:@@ERROR

戻り値:int型

SQL文が正常に実行されると@@ERRORの値は「0」になり、エラーが発生するとエラー番号が保持されます。一般には、この値を元に管理用データベース「master」の「sysmessages」テーブルに記録されたエラーメッセージが表示されますが、アプリケーションで独自のエラーメッセージを表示したり、予想されるエラーに対処する処理(エラートラップ)を設けたりできます。

@@ERRORの値はSQL文が実行される直前に0にリセットされるため、アプリケーションではSQL発行直後に@@ERRORの値を変数に保存しておき、後からエラーメッセージを表示させるとよいでしょう。



あとがき

冒頭で触れたように、数学関数はアプリケーションの側でも同様の処理を(SQLを用いないで)実現できます。システム関数も、一般的な業務処理で頻繁に用いられるものではありません。

しかし、例えばユーザーIDを取得するUSER_ID関数やワークステーションIDを取得するHOST_ID関数、エラー番号を取得する@@ERROR関数など、一般の処理内で用いて業務を効率化できるものもあります。

関数の仕様を細かく覚える必要はありませんが、これら便利な関数の機能を頭の隅に置いておくと、いざというときに役立ちます。

また、数学関数やシステム関数、次回紹介する型変換関数や流れ制御などは、一般的なアプリケーション内で実行するSQL文ではなく、様々なアプリケーションから共通して利用される処理をデータベースの側で用意する、ストアドプロシージャで利用すると威力を発揮します。


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




トップページ
数学関数
システム関数
値のバイト数~DATALENGTH
ユーザー番号~USER_ID
ユーザー名~USER_NAME
アプリケーション名~APP_NAME
ワークステーションの識別番号~HOST_ID
ワークステーション名~HOST_NAME
データベースID~DB_ID
データベース名~DB_NAME
IDフィールドの追加~IDENTITY
トランザクション数~@@TRANCOUNT
エラー番号~@@ERROR
あとがき
Copyright © MESCIUS inc. All rights reserved.