MSDE FunClub | 最終更新日 : 2000/08/21 | |
Microsoft Data Engine FunClub |
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) | ||
【第8章471p 〜 474p掲載】 |
-- [SQL08_04.SQL] -- SQLServer7.0 Transact-SQL言語 -- 日本技術ソフト開発 堀川 明 -- http://www.horikawa.ne.jp/msde/ -- -- このSQLプログラムは、 -- SET XACT_ABORT ON -- を使って、トランザクション内の整合性違反によって全体をロール -- バックします -- -- この[社員]テーブルは、AccessのNorthwindデモデータベース -- の[社員]テーブルをSQLServerに転送したものです -- -- カレントデータベースを MySampleTest にする USE MySampleTest GO -- (件処理されました)のメッセージを抑止する SET NOCOUNT ON GO -- 主キーチェックは省略します PRINT '' -- 改行します GO -- レコード挿入位置にレコードがあれば削除します DELETE FROM 社員 WHERE( 社員コード BETWEEN 10 AND 20 ) GO -- ********************************************************* -- 【トランザクションを使ったレコード挿入処理】 -- トランザクション内で主キーの重複登録整合性違反を発生させます -- ********************************************************* -- もしエラーが発生した場合は、トランザクションを自動的に -- ロールバックします SET XACT_ABORT ON GO -- 第1番目のトランザクション BEGIN TRANSACTION -- トランザクション開始 INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(10,'ヤマダ イチロウ' , '山田 一郎') INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(11,'ヤマダ ジロウ' , '山田 二郎') INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(12,'ヤマダ サブロウ', '山田 三郎') -- 社員コード11番は、整合性違反。主キーがすでに登録済み INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(11,'カトウ イチロウ' , '加藤 一郎') COMMIT TRANSACTION -- 第2番目のトランザクション BEGIN TRANSACTION -- トランザクション開始 INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(13,'ヤマダ シロウ' , '山田 四郎') INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(14,'ヤマダ ゴロウ' , '山田 五郎') INSERT INTO 社員(社員コード,フリガナ,氏名) VALUES(15,'ヤマダ ロクロウ' , '山田 六郎') COMMIT TRANSACTION GO -- ************************************** -- 直前のバッチが正常終了しましたか? -- ************************************** DECLARE @Code int SELECT @Code = @@ERROR IF( @Code <> 0 ) BEGIN PRINT '' PRINT '直前のバッチで、メッセージ番号 ' + CAST(@Code as varchar) + ' が発生しました' PRINT 'エラーが発生しましたね' END GO -- ********************** -- 標準モードに戻す -- ********************** -- 継続実行可能なエラーが起きた場合は、実行を継続する SET XACT_ABORT OFF 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