MSDE FunClub | 最終更新日 : 2000/06/17 | |
Microsoft Data Engine FunClub |
|
|
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