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