MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/08/21
Microsoft Data Engine FunClub
Since 2000.08.21
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




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

ウィンドウを閉じる


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


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