MSDE FunClub | 最終更新日 : 2000/08/11 | |
Microsoft Data Engine FunClub |
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) | ||
【第4章272p 〜 275p掲載】 |
-- [SQL04_03.SQL] -- SQLServer7.0 Transact-SQL言語 -- 日本技術ソフト開発 堀川 明 -- http://www.horikawa.ne.jp/msde/ -- -- このSQLプログラムは、 -- ローカル一時テーブルをストアドプロシージャの外部と内部で作成した -- その違いを調べます -- RAISERROR命令のNOWAITオプションを使います -- -- カレントデータベースを MySampleTest にする USE MySampleTest GO -- (何件処理しました のメッセージを抑制する SET NOCOUNT ON GO -- すでに同じ名前のストアドプロシージャが登録済みのときは、削除する IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PROC_OUT' AND type = 'P ') BEGIN DROP PROC PROC_OUT END IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PROC_IN' AND type = 'P ') BEGIN DROP PROC PROC_IN END GO -- すでに同じ名前のローカル一時テーブルが登録済みのときは、削除する -- 一時テーブルや一時プロシージャだけの存在チェック方法だけ異なる IF EXISTS (SELECT name FROM tempdb..sysobjects WHERE id = object_id('tempdb..#TMP_TBLOUT') AND type = 'U ') BEGIN DROP TABLE #TMP_TBLOUT END GO -- 一時ローカルテーブルを作成する CREATE TABLE #TMP_TBLOUT( ID int , ID2 int ) GO -- ********************* -- PROC_INの登録 -- ********************* CREATE PROCEDURE PROC_IN AS SET NOCOUNT ON --メッセージの抑制 -- このストアドプロシージャの中で使う一時テーブルを作成します CREATE TABLE #TMP_TBLIN( ID int , ID2 int ) -- #TMP_TBLIN 操作 INSERT INTO #TMP_TBLIN VALUES( 1 , 100 ) IF @@ERROR <> 0 BEGIN RAISERROR( '何で?エラーは起きないはずだよ?' , 16 , 127 ) RETURN 1 END ELSE -- NOWAIT機能があるRAISERRORは、即座にその内容が送信されます RAISERROR('[PROC_IN ]の中で、[#TMP_TBLIN ]テーブルに無事データ登録ができました' , 0 , 1 ) WITH NOWAIT -- #TMP_TBLOUT 操作 INSERT INTO #TMP_TBLOUT VALUES( 2 , 200 ) IF @@ERROR <> 0 BEGIN RAISERROR( '何で?エラーは起きないはずだよ?' , 16 , 127 ) RETURN 1 END ELSE RAISERROR( '[PROC_IN ]の中で、[#TMP_TBLOUT]テーブルに無事データ登録ができました' , 0 , 1 ) WITH NOWAIT -- ここで一時テーブルは削除されます GO -- ********************* -- PROC_OUTの登録 -- ********************* CREATE PROCEDURE PROC_OUT AS SET NOCOUNT ON --メッセージの抑制 -- ストアドプロシージャの外で作成された#TMP_TBLOUTは触れます INSERT INTO #TMP_TBLOUT VALUES( 1 , 100 ) IF @@ERROR <> 0 BEGIN RAISERROR( '何で?エラーは起きないはずだよ?' , 16 , 127 ) RETURN 1 END ELSE RAISERROR('[PROC_OUT]の中で、[#TMP_TBLOUT]テーブルに無事データ登録ができました', 0 , 1 ) WITH NOWAIT -- ストアドプロシージャを呼ぶ EXEC PROC_IN -- PROC_INの中で作成された一時テーブルはもう消えている(存在しない) -- この命令でエラーが発生します INSERT INTO #TMP_TBLIN VALUES( 1 , 100 ) IF @@ERROR = 0 BEGIN RAISERROR( '何でこれが正常終了なの?' , 16 , 127 ) RETURN 1 END -- この命令は、上記のエラー発生により実行されません RAISERROR( 'この命令は実行されません。上記エラーで呼び出し元に戻ります' , 16 , 127 ) GO -- ********************* -- プログラムの実行 -- ********************* DECLARE @ErrCd int PRINT '' EXEC PROC_OUT Select @ErrCd = @@ERROR -- 直前のSQL文(EXEC PROC_OUT)の実行結果を記憶 IF @ErrCd <> 0 BEGIN RAISERROR( 'ストアドプロシージャ[PROC_OUT]でエラーが起きました ErrorCode = %d' , 16 , 127 , @ErrCd ) END GO