MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/07/22
Microsoft Data Engine FunClub
Since 2000.07.22
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻)
【第2章201p 〜 203p掲載】

-- [DDL系SQL文の基礎(例題15)EX3-13.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--   指定されたテーブルの指定された列のUNIQUE制約を設定します

-- これから操作する既定のデータベースを MySampleTest にします
    USE MySampleTest
GO

-- ( 件処理されました)のメッセージの表示を抑止します
    SET NOCOUNT ON
GO

-- ******************************************************
--      UNIQUE制約を設定するストアドプロシージャの登録
-- ******************************************************
   IF( (object_id('SetUniqueConstraint') IS NOT NULL) AND
            OBJECTPROPERTY( object_id('SetUniqueConstraint' ) , 'IsProcedure' ) = 1 )
        BEGIN
               DROP PROCEDURE SetUniqueConstraint
        END
GO

    CREATE PROCEDURE  SetUniqueConstraint
            @TblName   sysname     ,    -- 対象となるテーブル
            @ColName   sysname     ,    -- 対象となる列の名前
            @DelFlag   int              -- 0:削除を行なう
                                        -- 1:登録を行なう
    AS
        SET NOCOUNT ON
        DECLARE @cmd      varchar(256)  -- 動的SQL文
        DECLARE @ConstName sysname      -- 制約の名前

        --列に設定された制約をすべて取得する
        --システムビュー表の検索
        DECLARE Unique_CUR INSENSITIVE CURSOR
        FOR SELECT CONSTRAINT_NAME FROM  INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
            WHERE( ( TABLE_NAME = @TblName ) AND (COLUMN_NAME = @ColName) )
            FOR READ ONLY

        -- カーソルを開く
        OPEN Unique_CUR

        -- 先頭行の読み込み(制約名の読み込み)
        FETCH NEXT FROM Unique_CUR INTO @ConstName

        WHILE( @@FETCH_STATUS = 0 )
          BEGIN
                 -- 読み込んだ制約名の種類を判別する
                 -- UNIQUE制約ですか?
                 IF( OBJECTPROPERTY( OBJECT_ID( @ConstName ) , 'IsUniqueCnst' ) = 1 )
                 BEGIN
                         --UNIQUE制約を削除する
                         --但し、外部からの参照整合性は行なっていないものとする
                         --厳密には、主キーの削除と同じ扱いになる(EX3-10参照)
                         EXEC( 'ALTER  TABLE ' + @TblName + ' DROP CONSTRAINT '
                                  + @ConstName )
                 END
             -- 次行の読み込み
             FETCH NEXT FROM Unique_CUR INTO @ConstName
          END

        -- カーソルを閉じる
        CLOSE Unique_CUR

        -- カーソルを破棄する
        DEALLOCATE Unique_CUR

        -- 削除処理だけですか?         
        IF( @DelFlag = 0 ) RETURN 0

        -- 新しいUNIQUE制約を登録する
        -- 制約名は、IX_列名 にします
        SELECT @cmd = 'ALTER TABLE ' + @TblName + ' ADD ' + 
                          'CONSTRAINT ' + '[IX_' +  @ColName + ']  UNIQUE ( ' +
                          @ColName + ' )'
        PRINT @cmd
        EXECUTE( @cmd )
        RETURN 0
GO


--  UNIQUE制約の設定例
--                          TableName ColumnName   0 or 1
    EXEC SetUniqueConstraint  '社員' , 'フリガナ' , 1
    EXEC SetUniqueConstraint  '社員' , '氏名'     , 1
GO


-- プロシージャを削除
    DROP PROCEDURE SetUniqueConstraint
GO

















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

ウィンドウを閉じる


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


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