| MSDE FunClub |
|
最終更新日 : 2000/08/11 |
|
Microsoft Data Engine FunClub
|
Since 2000.08.11
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) |
|
【第5章315p 〜 318p掲載】 |
-- [SQL05_02.SQL]
-- SQLServer7.0 Transact-SQL言語
-- 日本技術ソフト開発 堀川 明
-- http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
-- テーブル分割を応用したビュー表です
--
-- カレントデータベースを MySampleTest にする
USE MySampleTest
GO
-- ( 件処理されました)のメッセージの表示を抑止する
SET NOCOUNT ON
GO
-- *************************************************
-- テーブルやビュー表の作成権限が私にありますか?
-- db_owner または db_ddladmin グループに許可される
-- *************************************************
IF ( (IS_MEMBER('db_owner') <> 1 ) AND (IS_MEMBER('db_ddladmin') <> 1) )
BEGIN
RAISERROR( 'CREATE TABLE や CREATE VIEW文の実行権限がありません' , 16 , 127 )
RETURN
END
GO
-- ****************************************************************
-- テーブルまたはビュー表を削除する一時ストアドプロシージャの作成
-- ****************************************************************
CREATE PROCEDURE #TMP_DELETE
@ObjName VARCHAR(40) , -- TABLE OR VIEW NAME
@Flag CHAR(1) = 'U' -- TABLE='U' VIEW='V'
AS
-- TABLE or VIEW が存在しますか?
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE ( (TABLE_NAME = @ObjName )
AND (TABLE_TYPE = CASE @Flag
WHEN 'U' THEN 'BASE TABLE'
WHEN 'V' THEN 'VIEW'
END
)
)
)
BEGIN
IF ( @Flag = 'U' )
BEGIN
-- TABLEの削除
EXEC( 'DROP TABLE ' + @ObjName )
END
ELSE
BEGIN
-- VIEWの削除
EXEC( 'DROP VIEW ' + @ObjName )
END
END
GO
-- ********************************************************
-- 1月、2月、3月と各月に対応した個別テーブルを作成する
-- すでに同名のテーブルが存在していたらそれを削除する
-- ********************************************************
EXEC #TMP_DELETE 'MON_1' , 'U' -- 1月分のテーブル削除
EXEC #TMP_DELETE 'MON_2' , 'U' -- 2月分のテーブル削除
EXEC #TMP_DELETE 'MON_3' , 'U' -- 3月分のテーブル削除
-- 1月分のテーブルを新規作成します
CREATE TABLE MON_1 (
ID CHAR(4) CONSTRAINT PK_MON_1 PRIMARY KEY , -- 主キー
DATA VARCHAR(20) , -- ここでは適当な文字列を記憶する
MON INT DEFAULT 1 CHECK( MON = 1) -- これが分割テーブルを作るときの重要点!
)
-- 見本データの登録
INSERT INTO MON_1(ID,DATA) VALUES( '1001' , 'TEST DATA 1001' )
INSERT INTO MON_1(ID,DATA) VALUES( '1002' , 'TEST DATA 1002' )
-- 2月分のテーブルを新規作成します
CREATE TABLE MON_2 (
ID CHAR(4) CONSTRAINT PK_MON_2 PRIMARY KEY ,
DATA VARCHAR(20) ,
MON INT DEFAULT 2 CHECK( MON = 2)
)
-- 見本データの登録
INSERT INTO MON_2(ID,DATA) VALUES( '2001' , 'TEST DATA 2001' )
INSERT INTO MON_2(ID,DATA) VALUES( '2002' , 'TEST DATA 2002' )
-- 3月分のテーブルを新規作成します
CREATE TABLE MON_3 (
ID CHAR(4) CONSTRAINT PK_MON_3 PRIMARY KEY ,
DATA VARCHAR(20) ,
MON INT DEFAULT 3 CHECK( MON = 3)
)
-- 見本データの登録
INSERT INTO MON_3(ID,DATA) VALUES( '3001' , 'TEST DATA 3001' )
INSERT INTO MON_3(ID,DATA) VALUES( '3002' , 'TEST DATA 3002' )
GO
-- ********************************************************
-- 1月、2月、3月と各月を合成したビュー表を作成します
-- すでに同名のビュー表が存在していたらそれを削除する
-- ********************************************************
EXEC #TMP_DELETE 'MON_YEAR' , 'V' -- 合成用ビュー表の削除
GO
-- 1月から3月の分割テーブルを合成するビュー表の作成
CREATE VIEW MON_YEAR( ID , DATA , MON )
AS
SELECT * FROM MON_1
UNION ALL
SELECT * FROM MON_2
UNION ALL
SELECT * FROM MON_3
GO
-- *************************
-- アプリケーションの実行
-- *************************
-- 全レコード表示
PRINT ''
PRINT '全レコード表示'
SELECT ID , DATA FROM MON_YEAR
-- 1月と3月の表示
PRINT '1月と3月の部分表示'
SELECT ID , DATA FROM MON_YEAR WHERE MON IN(1,3)
GO
-- 不要になった一時ストアドプロシージャを削除する
DROP PROCEDURE #TMP_DELETE
GO