SQL Server : 3.変数や制御文の取り扱い

SQL Server(Microsoft SQL Server)はMicrosoftが開発しているRDBMSです。当ページでは変数・IF文・WHILE文といった制御構造についてまとめています。

1.データの抽出・出力

2.オブジェクトの操作・制御

3.変数や制御文の取り扱い

4.その他

スカラ変数

スカラ変数は単一のデータを格納する――言うなれば普通の変数です。変数名の頭には@を付けます。

宣言

変数を宣言する場合はDECLARE文を利用します。

--文法

DECLARE

@変数 データ型,

@変数 データ型,

:

:

:

@変数 データ型

--例文

DECLARE

@foo1 int,

@foo2 varchar(50)

もちろん初期化もできます。初期化も代入もされていない変数はNULLとして扱われます。

--例文

DECLARE

@foo1 int = 1,

@foo2 varchar(50) = 'Hello world.'

代入

宣言した変数に代入するときはSET文を利用します。

SET

@foo1 = 1,

@foo2 = 'Hello world.'

SELECT文で出力した結果を代入するときは以下のように記述します。

SELECT

@foo = COUNT(*)

FROM

Table_1

テーブル変数

テーブル変数は文字通りテーブルのように機能する変数です。使用感覚は普通のテーブルを扱うのと大きく変わりません。ところで、テーブル変数と似たものに一時テーブルというものがあります。両者の使い分けですが基本的にはテーブル変数のほうが良いようです。ただ、とても大規模なデータを扱う場合はテーブル変数よりも一時テーブルのほうがパフォーマンスが良いとは聞きます。

宣言

テーブル変数を宣言します。

DECLARE @foo

TABLE (

no int PRIMARY KEY,

name varchar(50)

)

代入

テーブル変数にレコードを挿入します。

INSERT INTO @foo (

no,

name,

price

)

VALUES

(

1,

'Apple',

100,

),

(

2,

'Blueberry',

200,

)

削除

テーブル変数のレコードを削除します。WHERE句は省略することができますが、WHERE句を省略するとテーブル変数に格納されている全てのレコードが削除されます。DELETE FROMはDELETEと省略することができます。

DELETE FROM @foo

WHERE

no > 10

参照

テーブル変数を参照します。テーブルを参照するようにFROM句で指定します。

SELECT

*

FROM

@foo

カーソル

カーソルは指定したテーブルから1レコードずつ抜き出す処理です。各レコードにそれぞれ処理を加えることができる便利なステートメントですが若干動作が重いという欠点があります。安易に多用せず、本当に必要かどうか見極める必要があるでしょう。

カーソルの利用は若干手間が掛かります。カーソルの範囲となるデータを指定し、データを収める変数を宣言し、カーソルを開く。カーソル利用中は1行ずつフェッチして、その度に変数にデータを代入する。カーソル利用後はカーソルを閉じて、解放するという手順を踏まなければエラーになる可能性があります。

--カーソルで抽出した値を格納する変数の宣言

DECLARE

@no int,

@name varchar(50),

@price int

--カーソル宣言

DECLARE cursor_1

CURSOR FOR

SELECT

no,

name,

price

FROM

Table_2

--カーソルを開く

OPEN cursor_1

--フェッチ

FETCH NEXT FROM cursor_1

INTO

@no,

@name,

@price

--カーソルの対象としたテーブル全てのレコードを参照するまでループ

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO Table_2 (

no,

name,

price

)

SELECT

@no,

@name,

@price

END

--カーソルを閉じる

CLOSE cursor_1

--カーソルを開放する

DEALLOCATE cursor_1

繰り返し処理

SQL Serverでは繰り返し処理としてWHILE文が用意されています。他の言語で見られるFOR文などはありません。WHILE文から強制的に抜けたいときはBREAK文を、繰り返し判定に戻りたいときはCONTINUE文を使います。

--文法

WHILE 条件式

BEGIN

※処理

END

--例文

DECLARE

@i int = 0

WHILE @i < 5

BEGIN

SELECT

*

FROM

Table_1

WHERE

no = @i

END

分岐処理

処理を分岐させるにはIF文を利用します。ELSE句は省略することができます。

IF 条件式

※条件式が真のときの処理

ELSE

※条件式が偽のときの処理

例外処理

エラー発生時にジャンプします。

BEGIN TRY

※ここでエラーが起きると下にジャンプ

END TRY

BEGIN CATCH

※ここに飛んできます

END CATCH

RETURN文

実行すると即座に処理を終了させて、戻り値を呼び出し元に返します。

RETURN 戻り値

トランザクション

トランザクション制御を行います。TRANSACTIONはTRANと省略することができます。

--トランザクション

BEGIN TRANSACTION

--ロールバック

ROLLBACK TRANSACTION

--コミット

COMMIT TRANSACTION