| MSDE FunClub |
|
最終更新日 : 2000/08/21 |
|
Microsoft Data Engine FunClub
|
Since 2000.08.21
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) |
|
【第8章484p 〜 487p掲載】 |
-- [SQL08_06.SQL]
-- SQLServer7.0 Transact-SQL言語
-- 日本技術ソフト開発 堀川 明
-- http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
-- トランザクションのセーブポイント
-- を理解します
--
-- この[社員]テーブルは、AccessのNorthwindデモデータベース
-- の[社員]テーブルをSQLServerに転送したものです
--
-- カレントデータベースを MySampleTest にする
USE MySampleTest
GO
-- (件処理されました)のメッセージを抑止する
SET NOCOUNT ON
GO
-- レコード挿入位置にレコードがあれば削除します
DELETE FROM 社員 WHERE( 社員コード BETWEEN 10 AND 20 )
GO
-- *********************************************************
-- 【トランザクションの SAVE ポイント例題】
-- *********************************************************
DECLARE @OutFlag int , @InFlag int
SELECT @OutFlag = 1 -- =1 にすると、全部の操作を取り消す
SELECT @InFlag = 1 -- =1 にすると、一部取り消し
PRINT ''
PRINT ' @OutFlag=' + CAST(@OutFlag as varchar) +
' @InFlag =' + CAST(@InFlag as varchar ) +
' で実行です'
PRINT ''
IF( @InFlag = 1 )
BEGIN
PRINT '*** ROLLBACK TRANSACTION SavePioint の実行です ***'
PRINT ''
END
-- トランザクション開始
BEGIN TRANSACTION OutTran
-- 命令の実行
INSERT INTO 社員(社員コード,フリガナ,氏名)
VALUES(10,'ヤマダ イチロウ' , '山田 一郎')
PRINT '[10][山田 一郎]のINSERT文を実行しました'
-- セーブポイントを設定する
SAVE TRANSACTION SavePioint
-- セーブポイントにロールバックすると以下の命令は取り消し
INSERT INTO 社員(社員コード,フリガナ,氏名)
VALUES(11,'ヤマダ ジロウ' , '山田 二郎')
PRINT '[11][山田 二郎]のINSERT文を実行しました'
-- セーブポイントに戻りますか?
IF( @InFlag = 1 )
BEGIN
PRINT '** SavePoint位置に戻ります。[11]の登録は無効 **'
ROLLBACK TRANSACTION SavePioint
END
-- セーブポイントに戻っても戻らなくても実行されます
INSERT INTO 社員(社員コード,フリガナ,氏名)
VALUES(12,'ヤマダ サブロウ', '山田 三郎')
PRINT '[12][山田 三郎]のINSERT文を実行しました'
-- 全部の操作を取り消す
IF( @OutFlag = 1 )
BEGIN
-- ロールバックを行う
ROLLBACK TRANSACTION
PRINT '全部の操作を取り消しました'
RETURN
END
-- トランザクション内の操作を確定します
COMMIT TRANSACTION OutTran
PRINT 'トランザクション内の操作を確定しました'
GO
-- *******************************
-- レコードの登録結果を表示
-- *******************************
DECLARE @社員コード int , @フリガナ varchar(20) , @氏名 varchar(20)
DECLARE @Str社員コード varchar(4) , @strout varchar(80)
DECLARE hC INSENSITIVE CURSOR FOR
SELECT 社員コード,フリガナ,氏名 FROM 社員
WHERE( 社員コード BETWEEN 10 AND 20 )
-- カーソルを開いてレコードを表示する
OPEN hC
-- レコードはありますか?
IF( @@CURSOR_ROWS = 0 )
BEGIN
PRINT ''
PRINT '*** レコードは存在しません ***'
PRINT ' レコード登録に失敗!! '
GOTO L9999
END
-- タイトル行の出力
EXEC master..xp_sprintf @strout OUTPUT , '[%.2s][%12s][%12s]' ,
'NO' , 'フリガナ' , ' 氏 名 '
PRINT ''
PRINT '**** 登録結果 ****'
PRINT @strout
-- 先頭行の取り出し
FETCH NEXT FROM hC INTO @社員コード,@フリガナ,@氏名
-- 0の時は、正常に取得できました
WHILE( @@FETCH_STATUS = 0 )
BEGIN
-- 取り出し内容の編集とその出力
SELECT @Str社員コード = CONVERT(char(4),@社員コード)
EXEC master..xp_sprintf @strout OUTPUT , '[%.2s][%12s][%12s]' ,
@Str社員コード , @フリガナ , @氏名
PRINT @strout
-- 次行の取り出し
FETCH NEXT FROM hC INTO @社員コード,@フリガナ,@氏名
END
L9999:
-- カーソルを閉じて破棄する
CLOSE hC
DEALLOCATE hC
GO