MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/06/17
Microsoft Data Engine FunClub
Since 2000.06.17
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻)
【第2章136p 〜 139p掲載】

-- [SQL02_02.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--  sp_databases ストアドプロシージャが返す結果セットの受け取り方
--  を示します
-- 結果セットを受け取るためには、結果セットと同じテーブルが必要です
--  ここでは、一時テーブルを使います
--
-- 【注意】
--   sp_databasesプロシージャは基本的には誰でも実行することができますが
--   今ログインしているユーザが、ある特定のデータベースにアクセスできない
--   時は、guestユーザが登録されたデータベースならアクセスが許されます
--   guestユーザも存在しない場合は、sp_databasesは
--
--     サーバー : メッセージ 916、レベル 14、状態 1、行 1
--     サーバー ユーザー 'user' は、データベース 'MyDatabaseOnly' では有効な
--     ユーザーではありません。
--
--  のようなエラーメッセージを表示しますので、注意してください
--  このような場合は、MyDatabaseOnlyデータベースにユーザ登録してもらいましょう
--

-- これから使う既定のデータベスを、MySampleTest にする
    USE MySampleTest
GO

-- ( 件処理されました)の表示を抑制する
    SET NOCOUNT ON
GO

-- ********************************************
--  クライアントにメッセージを即座に出力します
-- ********************************************
    IF( (object_id('MsgOut') IS NOT NULL) AND
        OBJECTPROPERTY(object_id('MsgOut'),'IsProcedure') = 1 )
      BEGIN
             DROP PROCEDURE MsgOut
      END
GO
     --////////////////////////////////
          CREATE PROCEDURE MsgOut
     --////////////////////////////////
              @msg varchar(256)
     AS
       --NOWAIT オプションを付けます
         RAISERROR('%s',0,1,@msg) WITH NOWAIT
         RETURN
GO


-- ************************************************************************
--   sysadminに所属していればdboユーザとして各データベースにアクセス可能
--   dboで無いときは、アクセスできないデータベースがある
--   そのときは、guestアカウントがそのデータベースに必要です
-- ************************************************************************
   -- サーバーロールsysadminに、あなたは所属していますか?
   IF( IS_SRVROLEMEMBER( 'sysadmin' ) = 0 )
     BEGIN
        EXEC MsgOut ' '
        EXEC MsgOut '******************************************************'
        EXEC MsgOut 'あなたは、sysadminに所属していません'
        EXEC MsgOut 'このため使用できないデータベースがあるかもしれません'
        EXEC MsgOut 'sp_databasesストアドプロシージャがエラーを返すことがあります'
        EXEC MsgOut 'その時は、システム管理者権限sa で実行するか、または、'
        EXEC MsgOut 'そのデータベースに、guestアカウントが必要です'
        EXEC MsgOut '******************************************************'
        EXEC MsgOut ' '
     END
GO
 

-- すでに同じ名前の一時テーブルがありますか?
-- 普通は存在しませんが、SQLプログラム開発中のミスで、一時テーブルが残る場合がある
-- 存在していれば、それを削除します
-- 一時テーブルのチェックは tempdbを使う。またnameではなく、object_id で比較する
    IF EXISTS (SELECT name FROM tempdb..sysobjects
               WHERE id =  object_id('tempdb..#TMP_SPDB') AND type = 'U ')  
      BEGIN
           PRINT '一時テーブルを削除します'
           DROP TABLE #TMP_SPDB
      END
GO

-- 一時テーブルを作成します
-- sp_databases の結果セットの解説書通りに宣言します
    CREATE TABLE #TMP_SPDB (
              DATABASE_NAME   sysname , 
              DATABASE_SIZE   int , 
              REMARKS         varchar(254) 
    )
GO


-- **************************
--   sp_databasesの受け取り
-- **************************
    -- sp_databasesの結果セットの受け取り処理例
    INSERT INTO #TMP_SPDB EXECUTE sp_databases

    -- 受け取った結果を表示する(DOS窓では上手に表示できない) 
    -- SELECT * FROM  #TMP_SPDB
GO

-- *********************************************************
--  1レコード単位で処理が必要な場合は、カーソルを使うこと
--    ここではカーソルの使い方も合わせて勉強をしましょう
-- *********************************************************
    DECLARE @dbnm  sysname      -- データベースの名前
    DECLARE @cnt   int          -- 取得行数のカウント
    DECLARE My_Cur CURSOR FOR
            SELECT  DATABASE_NAME FROM #TMP_SPDB

    PRINT 'データベースの名前を表示します'
    SELECT @cnt = 0

    -- カーソルを開く
    OPEN My_Cur

    -- カーソル先頭行を取得し、その値を@dbnmに代入する
    FETCH NEXT FROM My_Cur INTO @dbnm

    -- @@FETCH_STATUS = 0 の間、カーソルにはレコードがあります
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @cnt = @cnt + 1
        PRINT STR(@cnt) + ': Database = ' + @dbnm

        -- 次の値を取得する
        FETCH NEXT FROM My_Cur INTO @dbnm
    END

    -- カーソルを閉じる
    CLOSE  My_Cur

    -- 指定カーソルの資源全体の破棄
    DEALLOCATE  My_Cur
GO


-- 不要になった一時テーブルを削除する
    DROP TABLE #TMP_SPDB
GO








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

ウィンドウを閉じる


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


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