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

















技術評論社の書籍ガイドへ
上巻:ISBN4-7741-0965-7

ウィンドウを閉じる


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


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