MSDE FunClub | 最終更新日 : 2000/08/21 | |
Microsoft Data Engine FunClub |
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) | ||
【第8章488p 〜 491p掲載】 |
-- [SQL08_07.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 , @MidFlag int , @InFlag int SELECT @OutFlag = 0 -- =1 にすると、全部の操作を取り消す SELECT @MidFlag = 0 -- =1 にすると、中間と内部の操作を取り消す SELECT @InFlag = 1 -- =1 にすると、内部の操作を取り消す PRINT '' PRINT ' @OutFlag=' + CAST(@OutFlag as varchar) + ' @MidFlag=' + CAST(@MidFlag as varchar) + ' @InFlag =' + CAST(@InFlag as varchar) + ' で実行しました' PRINT '' -- トランザクション開始 BEGIN TRANSACTION OutTran -- 外側命令部の実行(注:カナは半角文字です) INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(10,'ソトガワ イチロウ' , '外側 一郎') -- 【外側命令部の終了位置に戻れるようにする】 SAVE TRANSACTION SaveOutTran -- 中間命令部の実行 INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(11,'ナカマ ジロウ' , '中間 二郎') -- 【中間命令部の終了位置に戻れるようにする】 SAVE TRANSACTION SaveMidTran -- 内側命令部の実行 INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(12,'ウチガワ サブロウ', '内側 三郎') IF( @InFlag = 1 ) BEGIN -- 内側命令部で実行された内容を取り消す -- 中間命令部の終了状態に戻る ROLLBACK TRANSACTION SaveMidTran -- 中間命令終了状態でデータベースを確定する COMMIT TRANSACTION PRINT '【外側+中間】操作結果を確定します' RETURN END -- 中間命令部以降で実行された内容を取り消す IF( @MidFlag = 1 ) BEGIN -- 外側命令終了状態に戻る ROLLBACK TRANSACTION SaveOutTran -- 外側命令終了状態でデータベースを確定する COMMIT TRANSACTION PRINT '【外側】操作結果を確定します' RETURN END -- 全部の操作を取り消す 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