03月 « 2018年04月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  » 05月

スポンサーサイト

--., --th -- --:-- 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Transact-SQL

Tue., 27th 2013 00:10 

entry_img_30.png
Transact-SQL の制御フローのためのキーワードとしては、BEGIN と END、BREAK、CONTINUE、GOTO、IF と ELSE、RETURN、WAITFOR、WHILE がある。
IF と ELSE によって条件付実行が可能となる。例えば、日付が週末であれば "weekend" と表示し、そうでなければ "weekday" と表示するといった処理が可能である。
IF DATEPART(dw, GETDATE()) = 7 OR DATEPART(dw, GETDATE()) = 1
PRINT 'It is the weekend.'
ELSE
PRINT 'It is a weekday.'
BEGIN と END は文のブロック化を可能とする。例えば、上記のコードで複数の文を条件付で実行する場合、BEGIN と END を使って次のように書く。
IF DATEPART(dw, GETDATE()) = 7 OR DATEPART(dw, GETDATE()) = 1
BEGIN
PRINT 'It is the weekend.'
PRINT 'Get some rest!'
END
ELSE
BEGIN
PRINT 'It is a weekday.'
PRINT 'Get to work!'
END
WAITFOR は、指定された時間だけ待つか、指定された時刻まで待つ。遅延制御に使ったり、指定時刻まで実行をブロックするのに使われる。
RETURN は、ストアドプロシージャや関数から即座に戻るときに使う。
BREAK は WHILE ループからの脱出、CONTINUE はループの次の繰り返しへの飛び越しである。WHILE ループの例は下記にある。
局所変数[編集]

局所変数は実行中のスクリプト内でのみ使われる。Transact-SQL はユーザー定義の広域変数をサポートしていない。
DECLARE によって変数名と型を指定して変数を宣言する。SET 文で値を代入し、その後の文で変数名を使うことでその値を参照できる。
次のスクリプトは整数の変数を宣言し、値を初期化し、WHILE ループで処理を実行している。
DECLARE @Counter INT
SET @Counter = 10
WHILE @Counter > 0
BEGIN
PRINT 'The count is ' + CONVERT(VARCHAR(10), @Counter)
SET @Counter = @Counter - 1
END
このループ本体は、変数の値を含むメッセージを表示し、その値をデクリメントするものである。
変数の初期化は次のようにもできる。
DECLARE @ArticleCount INT
SELECT @ArticleCount = COUNT(*) FROM Articles

INSERT INTO SizeLog (SampleTime, ArticleCount) VALUES (GETDATE(), @ArticleCount)
これは、Articles 表の行数を取得し、その値と現在時刻を SizeLog 表の行として挿入するものである。
グローバル変数[編集]

グローバル変数は実行中のスクリプト内での様々なステータスを監視・取得ができる。 Transact-SQLではグローバル変数は主として@@で書き始める。
良く使われるグローバル変数としては以下のものがある。
@@ERROR 直前に実行したクエリのエラー状態を保持
@@ROWCOUNT 直前に実行したクエリの処理数を保持
@@FETCH_STATUS 現在実行中のカーソルのFETCH状態を保持(@@FETCH_STATUS = 0の場合、最後の行)
下記にグローバル変数を利用したエラー処理の例を示す
クエリ実行時のエラーハンドリング
DECLARE @ERROR_STATUS INT
SET @ERROR_STATUS = 0

SELECT DATE
FROM CALENDAR WITH (NOLOCK)
WHERE YEAR = '2007' AND MONTH = '01'

-- グローバル変数@@ERRORにて直前のクエリのエラー状況を取得
-- 0 の場合はエラーなし
SET @ERROR_STATUS = @@ERROR

IF @ERROR_STATUS <> 0
BEGIN
PRINT 'ERROR OCCURD'
RETURN
END
UPDATE実行時の該当件数が無かった場合のエラーハンドリング
DECLARE @ROW_COUNT INT
SET @ROW_COUNT = 0

UPDATE CALENDAR
SET DATE = GETDATE()
WHERE YEAR = '2007' AND MONTH = '01'

-- グローバル変数@@ROWCOUNTにて直前のクエリの結果件数を取得
SET @ROW_COUNT = @@ROWCOUNT

IF @ROW_COUNT = 0
BEGIN
PRINT 'NO RECORD UPDATED'
RETURN
END
DELETE文とUPDATE文の変更

コメントの投稿

非公開コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。