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




技術評論社の書籍ガイドへ
上巻:ISBN4-7741-0965-7

ウィンドウを閉じる


(株)日本技術ソフト開発 責任編集:堀川 明
MSDE FunClubに関するご意見・ご要望等ございましたら、 msdefun@horikawa.ne.jp までご連絡下さい。
HOME: http://www.horikawa.ne.jp/msde/


MSDE FunClubの運営は、マイクロソフト社とは一切の関係はありません