| 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