Transact SQLとは? わかりやすく解説

Transact-SQL

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/01/26 03:35 UTC 版)

Transact-SQL (T-SQL) は、マイクロソフトSybaseが独自に拡張したSQL言語である。マイクロソフトによる実装は Microsoft SQL Server として出荷されている。Sybase ではこの言語を Sybase SQL Server の後継である Adaptive Server Enterprise で使っている。

SQL を強化するため、次のような機能が追加されている。

  • 制御フロー言語
  • 局所変数
  • グローバル変数
  • 文字列処理、データ処理、数値処理のための各種関数。
  • DELETE文とUPDATE文の強化

制御フロー言語

Transact-SQL の制御フローのためのキーワードとしては、BEGINENDBREAKCONTINUEGOTOIFELSERETURNWAITFORWHILE がある。

IFELSE によって条件付実行が可能となる。例えば、日付が週末であれば "weekend" と表示し、そうでなければ "weekday" と表示するといった処理が可能である。

IF DATEPART(dw, GETDATE()) = 7 OR DATEPART(dw, GETDATE()) = 1
   PRINT 'It is the weekend.'
ELSE
   PRINT 'It is a weekday.'

BEGINEND は文のブロック化を可能とする。例えば、上記のコードで複数の文を条件付で実行する場合、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 は、ストアドプロシージャや関数から即座に戻るときに使う。

BREAKWHILE ループからの脱出、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文の変更

Transact-SQL では、DELETE文とUPDATE文にFROM節を指定可能となっている。

次の例では、'Idle' フラグの立っている全ての users を削除する。

DELETE FROM users as u
	JOIN user_flags as f
		ON u.id=f.id
	WHERE f.name = 'Idle'

カーソルの実装

Transact-SQL では、CURSORを使用することで、テーブルを逐次処理することが可能である。

次の例では、CURSORを利用し、CALENDARテーブルを条件分けしながら更新する処理である。

-- カーソルの定義
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 でも指定可能になってしまい、混乱が生じる。

関連項目

外部リンク


「Transact SQL」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。



固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Transact SQL」の関連用語

Transact SQLのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Transact SQLのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのTransact-SQL (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS