| MSDE FunClub |
|
最終更新日 : 2000/07/22 |
|
Microsoft Data Engine FunClub
|
Since 2000.07.22
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) |
|
【第2章204p 〜 206p掲載】 |
-- [DDL系SQL文の基礎(例題16)EX3-14.SQL]
-- SQLServer7.0 Transact-SQL言語
-- 日本技術ソフト開発 堀川 明
-- http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
-- 指定されたテーブルの指定された列のインデックスを削除/設定
-- します
-- これから操作する既定のデータベースを MySampleTest にします
USE MySampleTest
GO
-- ( 件処理されました)のメッセージの表示を抑止します
SET NOCOUNT ON
GO
-- ******************************************************
-- インデックスを設定するストアドプロシージャの登録
-- ******************************************************
IF( (object_id('SetIndex' ) IS NOT NULL) AND
OBJECTPROPERTY( object_id('SetIndex' ) , 'IsProcedure' ) = 1 )
BEGIN
DROP PROCEDURE SetIndex
END
GO
CREATE PROCEDURE SetIndex
@TblName sysname , -- 対象となるテーブル
@ColName sysname , -- 対象となる列の名前
@Unique int , -- 0:通常のINDEX 1:UNIQUE
@DelFlag int -- 0:削除を行なう
-- 1:登録を行なう
AS
SET NOCOUNT ON
DECLARE @cmd varchar(256) -- 動的SQL文
DECLARE @IndexName sysname -- インデックスの名前
DECLARE @IndexKey nvarchar(2078) -- 列の名前
-- sp_helpindexストアドプロシージャが返す一時テーブルの準備
CREATE TABLE #RS_sp_helpindex(
index_name sysname , --インデックス名
index_description varchar(210), --インデックスの説明
--列は、列1,列2,列3 のような文字列です
index_keys nvarchar(2078) --インデックスの列
)
-- テーブルに設定されたインデックスの情報を取得する
INSERT INTO #RS_sp_helpindex EXECUTE sp_helpindex @TblName
-- カーソルを設定して1レコード毎の調査を行なう
DECLARE Index_CUR INSENSITIVE CURSOR
FOR SELECT index_name , index_keys FROM #RS_sp_helpindex
FOR READ ONLY
-- カーソルを開く
OPEN Index_CUR
-- 先頭行の読み込み(制約名の読み込み)
FETCH NEXT FROM Index_CUR INTO @IndexName , @IndexKey
WHILE( @@FETCH_STATUS = 0 )
BEGIN
-- 列内容文字列の中に、該当する列名が含まれていますか?
IF( CHARINDEX( @ColName , -- 検索を行なう文字列
@IndexKey , -- 検索対象
0 ) -- 先頭文字から探す
> 0 )
BEGIN
-- 前の例題で残っているUNIQUE 制約ですか?
IF( OBJECTPROPERTY( object_id(@IndexName) , 'IsUniqueCnst' ) = 1 )
BEGIN
-- UNIQUE制約の削除
SELECT @cmd = 'ALTER TABLE ' + @TblName +
' DROP CONSTRAINT ' + @IndexName
EXEC( @cmd )
END
ELSE
BEGIN
-- 検索できました(インデックスの削除)
SELECT @cmd = 'DROP INDEX ' + @TblName + '.[' + @IndexName
+ ']'
--PRINT @cmd
EXEC( @cmd )
END
END
-- 次行の読み込み
FETCH NEXT FROM Index_CUR INTO @IndexName , @IndexKey
END
-- カーソルを閉じる
CLOSE Index_CUR
-- カーソルを破棄する
DEALLOCATE Index_CUR
-- 削除処理だけですか?
IF( @DelFlag = 0 ) RETURN 0
-- 新しいINDEX制約を登録する
-- 制約名は、IDX_列名 にします
SELECT @cmd = 'CREATE ' + CASE @Unique
WHEN 0 THEN ''
WHEN 1 THEN 'UNIQUE'
END
+ ' INDEX ' + '[IDX_' + @ColName + '] ON '
+ @TblName + ' ( ' + @ColName + ' )'
PRINT @cmd
EXECUTE( @cmd )
RETURN 0
GO
-- INDEX制約の設定例
-- TableName ColumnName 1:Unique 1:Set
EXEC SetIndex '社員' , 'フリガナ' , 0 , 1
EXEC SetIndex '社員' , '氏名' , 1 , 1
GO
-- プロシージャを削除
DROP PROCEDURE SetIndex
GO