Transact-SQL
Transact-SQL (T-SQL) は、マイクロソフトとSybaseが独自に拡張したSQL言語である。マイクロソフトによる実装は Microsoft SQL Server として出荷されている。Sybase ではこの言語を Sybase SQL Server の後継である Adaptive Server Enterprise で使っている。 SQL を強化するため、次のような機能が追加されている。
制御フロー言語Transact-SQL の制御フローのためのキーワードとしては、
IF DATEPART(dw, GETDATE()) = 7 OR DATEPART(dw, GETDATE()) = 1
PRINT 'It is the weekend.'
ELSE
PRINT 'It is a weekday.'
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
局所変数局所変数は実行中のスクリプト内でのみ使われる。Transact-SQL はユーザー定義の広域変数をサポートしていない。
次のスクリプトは整数の変数を宣言し、値を初期化し、 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ではグローバル変数は主として@@で書き始める。 良く使われるグローバル変数としては以下のものがある。
下記にグローバル変数を利用したエラー処理の例を示す
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
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文の変更Transact-SQL では、DELETE文とUPDATE文にFROM節を指定可能となっている。 次の例では、'Idle' フラグの立っている全ての DELETE FROM users as u
JOIN user_flags as f
ON u.id=f.id
WHERE f.name = 'Idle'
カーソルの実装Transact-SQL では、 次の例では、 -- カーソルの定義
DECLARE
CUR_CALENDAR_UPDATE
CURSOR FOR
SELECT
YEAR,
MONTH,
DAY
FROM
CALENDAR
-- 変数宣言/初期化
DECLARE @wk_year CHAR(4)
DECLARE @wk_month VARCHAR(2)
DECLARE @wk_day VARCHAR(2)
SET @wk_year = ''
SET @wk_month = ''
SET @wk_day = ''
-- カーソルを開く
OPEN CUR_CALENDAR_UPDATE
-- カーソルより最初の1行を取得
FETCH NEXT FROM
CUR_CALENDAR_UPDATE
INTO
@wk_year,
@wk_month,
@wk_day
-- カーソルで取得した行が終端に達するまで処理を継続する
WHILE @@FETCH_STATUS = 0
BEGIN
-- カーソルで取得したYEARが2006より大きい場合は処理を行う
IF @wk_year > 2006
BEGIN
UPDATE
CALENDAR
SET
DATE = GETDATE()
WHERE
YEAR = @wk_year
AND
MONTH = @wk_month
AND
DAY = @wk_day
END
-- 次の1件を取得する
FETCH NEXT FROM
CUR_CALENDAR_UPDATE
INTO
@wk_year,
@wk_month,
@wk_day
END
-- カーソルを閉じる
CLOSE CUR_CALENDAR_UPDATE
-- カーソルのメモリを開放
DEALLOCATE CUR_CALENDAR_UPDATE
批判Transact-SQL はPL/SQL同様、機能を追加することで SQL 標準との互換性が損なわれているだけでなく、SQLが本来保持すべきモジュール性を破壊していると批判されている。換言すれば、Transact-SQL の追加機能は普通ならプログラミング言語や埋め込みSQLに実装されるべきものである。そのため、制御構造をプログラミング言語でも SQL でも指定可能になってしまい、混乱が生じる。 関連項目
外部リンク |
Portal di Ensiklopedia Dunia