| MSDE FunClub |
|
最終更新日 : 2000/08/11 |
|
Microsoft Data Engine FunClub
|
Since 2000.08.11
|
|
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