MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/11/23
Microsoft Data Engine FunClub
Since 2000.11.23
SQLServer7.0/MSDE 完全トレーニングテキスト(下巻)
【第23章471p 〜 476p掲載】

-- [ADPTEST.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--             http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--   Access2000 ADPプロジェクトのサーバー側環境設定
--   プログラムです
--   データベースやテーブル、ストアドプロシージャなど
--   必要なオブジェクトをすべて作成します
--
-- [注意]
--   このプログラムの実行は System Administrators
--   などの権限が必要です
--

-- ( 件処理されました)のメッセージの表示を抑止します
    SET NOCOUNT ON
GO

--*********************************
--【データベースを新規に作成する】
--*********************************
    IF EXISTS ( SELECT name FROM master..sysdatabases
           WHERE( name = 'AC20_ADPTEST' ) )
      BEGIN
           RAISERROR('AC20_ADPTESTデータベースが存在します。中止しました',16,1)
           --*** 削除命令はコメント DROP DATABASE AC20_ADPTEST
           RETURN
      END
    --データベースをデフォルトで作成する
    CREATE DATABASE AC20_ADPTEST
GO

--*****************************************
-- 指定されたオブジェクトを削除する
--  ローカル一時ストアドプロシージャの登録
--*****************************************
    USE  tempdb    --接続先DBの定義
    IF( (Object_id('tempdb..#Delete_Object') IS NOT NULL) AND
        (OBJECTPROPERTY(Object_id('tempdb..#Delete_Object'),'IsProcedure')=1) )
      BEGIN
           DROP PROCEDURE #Delete_Object
           --PRINT '#Delete_Objectを削除しました'
      END
GO
    CREATE PROCEDURE #Delete_Object
            @name sysname ,        --削除するオブジェクトの名前
            @type char(2)          --オブジェクトのタイプ
    AS
      DECLARE @word varchar(20)
      DECLARE @cmd varchar(100)
      IF EXISTS ( SELECT name FROM AC20_ADPTEST..sysobjects 
                 WHERE( (name=@name) AND (type=@type) ) )
        BEGIN
           SELECT @word = CASE @type
                          WHEN 'U ' THEN 'TABLE'
                          WHEN 'V ' THEN 'VIEW'
                          WHEN 'P ' THEN 'PROCEDURE'
                          END
           --オブジェクトの削除
           SELECT @cmd = 'DROP '+ @word + ' ' + @name
           --PRINT 'cmd=' + @cmd
           EXEC( @cmd )
        END
GO

--*****************************************
--       オブジェクトの削除を行なう
--*****************************************
    USE AC20_ADPTEST    --接続先を元に戻す
GO

    EXEC #Delete_Object '患者' , 'U '  --多側テーブルを先に削除
    EXEC #Delete_Object '医師' , 'U '  --1側テーブル

    EXEC #Delete_Object '医師VIEW' , 'V '
    EXEC #Delete_Object '医師患者' , 'V '
    EXEC #Delete_Object '医師患者2' , 'V '


    EXEC #Delete_Object 'PROC_医師'  , 'P '
    EXEC #Delete_Object 'PROC_医師2' , 'P '
    EXEC #Delete_Object 'PROC_医師患者'  , 'P '
    EXEC #Delete_Object 'PROC_医師患者2' , 'P '

    EXEC #Delete_Object 'Resync_医師患者', 'P '

    EXEC #Delete_Object 'Proc_sp_databases', 'P '

GO

--*****************************************
--       テーブルを新規に作成します
--*****************************************

    --【1対多】の1側テーブルの作成
    CREATE TABLE 医師 (
	医師ID         int         NOT NULL  PRIMARY KEY ,
	医師名         varchar(50) NULL ,
	医師TEL        varchar(50) NULL 
    )
    PRINT '医師テーブルを作成しました'

    --【1対多】の多側テーブルの作成
    CREATE TABLE 患者 (
	患者ID   int         NOT NULL PRIMARY KEY ,
	姓       varchar(50) NULL ,
	名       varchar(50) NULL ,
	主治医ID int         NULL ,  
        -- 外部参照の定義
        FOREIGN KEY( 主治医ID ) REFERENCES 医師 ( 医師ID )        
    )
    PRINT '患者テーブルを作成しました'
GO

    -- 【医師】見本データの登録
    INSERT INTO 医師 VALUES( 10 , '田中' , '(206)-882-80xx' )
    INSERT INTO 医師 VALUES( 20 , '佐藤' , '(206)-936-43xx' )
    INSERT INTO 医師 VALUES( 30 , '山田' , '(206)-912-25xx' )

    -- 【患者】見本データの登録
    INSERT INTO 患者 VALUES( 1 , '鈴木' , '一郎' , 10 )
    INSERT INTO 患者 VALUES( 2 , '中村' , '恵子' , 20 )
    INSERT INTO 患者 VALUES( 3 , '山田' , '太郎' , 20 )
    INSERT INTO 患者 VALUES( 4 , '高橋' , '富夫' , 10 )
GO

--*****************************************
--       ビューを新規に作成します
--*****************************************
    CREATE VIEW 医師VIEW
    AS
       SELECT * FROM 医師
GO

    CREATE VIEW 医師患者
    AS
       SELECT 患者.患者ID ,
              患者.姓 ,
              患者.名 ,
              患者.主治医ID ,
              医師.医師名 ,
              医師.医師TEL
      FROM 患者 INNER JOIN 医師
      ON 患者.主治医ID = 医師.医師ID
GO

    CREATE VIEW 医師患者2
    AS
       SELECT 患者.患者ID     AS 患者番号 ,
              患者.姓         AS 患者姓   ,
              患者.名         AS 患者名   ,
              患者.主治医ID   AS 医師番号 ,
              医師.医師名     AS 医師氏名 ,
              医師.医師TEL    AS 医師電話
      FROM 患者 INNER JOIN 医師
      ON 患者.主治医ID = 医師.医師ID
GO




--*****************************************
--    ストアドプロシージャを作成します
--*****************************************
    CREATE PROCEDURE PROC_医師
    AS
        SELECT * FROM 医師
GO

    CREATE PROCEDURE PROC_医師2
             @no   int = 0
    AS
        SELECT * FROM 医師
            WHERE( 医師ID = @no )
GO

    CREATE PROCEDURE PROC_医師患者
    AS
       SELECT 患者.患者ID     AS 患者番号 ,
              患者.姓         AS 患者姓   ,
              患者.名         AS 患者名   ,
              患者.主治医ID   AS 医師番号 ,
              医師.医師名     AS 医師氏名 ,
              医師.医師TEL    AS 医師電話
      FROM 患者 INNER JOIN 医師
      ON 患者.主治医ID = 医師.医師ID
GO

    CREATE PROCEDURE PROC_医師患者2
            @st int  ,   --検索開始
            @ed int      --検索終了
    AS
       SELECT 患者.患者ID     AS 患者番号 ,
              患者.姓         AS 患者姓   ,
              患者.名         AS 患者名   ,
              患者.主治医ID   AS 医師番号 ,
              医師.医師名     AS 医師氏名 ,
              医師.医師TEL    AS 医師電話
      FROM 患者 INNER JOIN 医師
      ON 患者.主治医ID = 医師.医師ID
      WHERE( 患者.患者ID BETWEEN @st AND @ed )
GO


--*****************************************
--   再同期コマンド用ストアドプロシージャ
--*****************************************

    CREATE PROCEDURE Resync_医師患者
              @no int
    AS
       SELECT 患者.患者ID     AS 患者番号 ,
              患者.姓         AS 患者姓   ,
              患者.名         AS 患者名   ,
              患者.主治医ID   AS 医師番号 ,
              医師.医師名     AS 医師氏名 ,
              医師.医師TEL    AS 医師電話
      FROM 患者 INNER JOIN 医師
      ON 患者.主治医ID = 医師.医師ID
      WHERE( 患者.患者ID = @no )
GO

--*****************************************
--  システムストアドプロシージャと連結する
--   結果セットをクライアント側に表示する
--*****************************************

    CREATE PROCEDURE Proc_sp_databases
    AS
      GOTO SKIP
           -- Access ADPのフォームで列名を認識させる
           SELECT 'Dummy' AS DATABASE_NAME ,
                  'Dummy' AS DATABASE_SIZE ,
                  'Dummy' AS REMARKS
SKIP:
      -- ストアドプロシージャを実行する
      EXEC sp_databases
GO

    PRINT '終了しました'
GO




技術評論社の書籍ガイドへ
下巻:ISBN4-7741-0966-5

ウィンドウを閉じる


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


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