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(*) FROM table_1 ; --こういう書き方もできます SET @count = ( SELECT COUNT(*) FROM table_1 ) ;

テーブル変数

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

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

宣言

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

--文法 DECLARE @変数名 TABLE ( カラム1名 データ型 オプション, カラム2名 データ型 オプション, カラムn名 データ型 オプション ) ; --例文 DECLARE @var_table TABLE ( , 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_table WHERE price < 100 ; --例文(省略版) DELETE @var_table WHERE price < 100 ;

カーソル

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

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

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

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

分岐処理

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

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

繰り返し処理

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

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

例外処理

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

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

RETURN文

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

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

トランザクション処理

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

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