SQL Server

変数や制御文など

当ページでは変数や制御文などの取り扱いについてまとめています。

スカラ変数

スカラ変数は単一の値を保存する変数――つまり普通の変数です。変数名の頭にはアットマーク記号を付けます。

宣言

変数を宣言するにはDECLARE文を使用します。初期値は省略してもかまいません。

--文法DECLARE@変数1名 データ型 = 初期値,@変数2名 データ型 = 初期値,@変数n名 データ型 = 初期値;--例文DECLARE@value int,@id char(8) = '00000000';

代入

変数に値を代入するときは原則としてSET文を使います。

--文法SET@変数1名 = 値,@変数2名 = 値,@変数n名 = 値;--例文SET@value = 123,@id = '44556677',;

SELECT文のなかに組み込むことで出力した結果を格納することができます。

SELECT@count = COUNT(*)FROMtable_1;--こういう書き方もできますSET@count = (SELECTCOUNT(*)FROMtable_1);

テーブル変数

テーブル変数は文字通りテーブルのように機能する変数です。使用感覚はテーブルを扱うときと大きく変わりません。

テーブル変数と似たものに一時テーブルというものがあります。両者の使い分けですが基本的にはテーブル変数を使うほうが良いようです。ただ、大規模なデータを取り扱う際は一時テーブルに格納したほうがパフォーマンスが優れることがあるようです。

宣言

テーブル変数を宣言するにはDECLARE文を使います。

--文法DECLARE @変数名TABLE (カラム1名 データ型 オプション,カラム2名 データ型 オプション,カラムn名 データ型 オプション);--例文DECLARE @var_tableTABLE (,name varchar(50) PRIMARY KEY,price int NOT NULL);

代入

テーブル変数にレコードを挿入するにはINSERT文を使います。

--文法INSERT INTO @テーブル変数名 (カラム1名,カラム2名,カラムn名)VALUES (カラム1に挿入するデータ,カラム2に挿入するデータ,カラムnに挿入するデータ), (カラム1に挿入するデータ,カラム2に挿入するデータ,カラムnに挿入するデータ);--例文INSERT INTO @var_table (name,price)VALUES ('Apple',270);

削除

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

--文法DELETE FROM @テーブル変数名WHERE条件式;--例文DELETE FROM @var_tableWHEREprice < 100;--例文(省略版)DELETE @var_tableWHEREprice < 100;

カーソル

カーソルは指定したテーブル、あるいはテーブル変数から1レコードずつ抽出し、各レコードに処理を加える処理です。他のプログラミング言語でいうところのforeach文などが、これに近い事をやっていると言えるでしょう。

カーソルを利用するには、カーソル自体の宣言に加えて、カーソルで抽出したレコードの値を収容する変数も用意しておく必要があります。また、カーソルの開始・終了・解放といった処理も必要です。

ちなみに、カーソルは比較的重い処理となりますのでパフォーマンスがシビアに求められる状況では使うべきかどうかの見極めをしっかり行ってください。

--使用例--1.カーソルで取得した値を収める変数を用意しますDECLARE@no int,@name varchar(50),@price int;--2.カーソルを宣言しますDECLARE cursor_1CURSOR FORSELECTno,name,priceFROMtable_1;--3.カーソルを開きますOPEN cursor_1;--4.フェッチしますFETCH NEXT FROM cursor_1INTO@no,@name,@price;--5.カーソルの抽出対象となるテーブルの全てのレコードを1つずつ抽出していきますWHILE @@FETCH_STATUS = 0BEGIN※具体的な処理END;--6.カーソルを閉じますCLOSE cursor_1;--7.カーソルを開放しますDEALLOCATE cursor_1;

分岐処理

処理を分岐させるにはIF文を使います。IF句・ELSE IF句・ELSE句から成り、ELSE IF句・ELSE句は省略することができます。また、ELSE IF句は複数記述することができます。また、各句のBEGIN-ENDブロックは省略することができます。

--文法IF 条件式BEGIN※処理ENDELSE IF 条件式BEGIN※処理ENDELSEBEGIN※処理END;--例文IF @foo > 0BEGINSELECT'変数fooは1以上です'ENDELSE IF @foo < 0BEGINSELECT'変数fooは-1以下です'ENDELSEBEGIN'変数fooは0です'END;--例文(BEGIN-ENDブロック省略版)IF @foo > 0SELECT'変数fooは1以上です'ELSE IF @foo < 0SELECT'変数fooは-1以下です'ELSE'変数fooは0です';

繰り返し処理

処理を繰り返すためにはWHILE文を使います。WHILE文内から抜けたいときはBREAK文を、条件判定に戻りたいときはCONTINUE文を使います。

--文法WHILE 条件式BEGIN※処理END;--例文WHILE @foo < 3BEGINSELECT@foo;SET@foo = @foo + 1;END;

例外処理

SQL Serverの例外処理ではTRY-CATCH文を使います。BEGIN TRYブロックとBEGIN CATCHブロックは1セットです。どちらかのみを記述することはできません。また、記述順を逆にしてもエラーになります。

BEGIN TRY※エラーが起こりそうな処理END TRYBEGIN CATCH※エラーが起こったときの処理END CATCH

RETURN文

RETURN文が実行されると処理がそこで終わり、呼び出し元に値を返します。

--文法RETURN 戻り値;--例文RETURN 0;

トランザクション処理

SQL Serverにおいて、トランザクションの開始・ロールバック・コミットには以下のクエリを使います。

--トランザクション開始BEGIN TRANSACTION;--ロールバックROLLBACK TRANSACTION;--コミットCOMMIT TRANSACTION;