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