SQL Server インデックスの作成

SQL Server Native Client OLE DB プロバイダは、コンシューマが SQL Server テーブルに新しいインデックスを定義できる、IIndexDefinition::CreateIndex 関数を公開します。

SQL Server Native Client OLE DB プロバイダでは、テーブル インデックスがインデックスまたは制約として作成されます。SQL Server では、制約を作成する権限がテーブルの所有者、データベースの所有者、および特定の管理ロールのメンバに許可されます。テーブルにインデックスを作成できるのは、既定では、テーブルの所有者だけです。したがって、CreateIndex が成功するか失敗するかは、アプリケーション ユーザーのアクセス権だけでなく、作成するインデックスの種類によっても異なります。

テーブル名は、pTableID パラメータの uName 共用体の pwszName メンバに Unicode 文字列で指定します。pTableIDeKind メンバを DBKIND_NAME にする必要があります。

pIndexID パラメータには NULL を指定できます。NULL を指定すると、SQL Server Native Client OLE DB プロバイダにより、インデックスの一意な名前が作成されます。pIndexID パラメータに DBID への有効なポインタを指定することで、インデックスの名前をキャプチャできます。

インデックス名は、pIndexID パラメータの uName 共用体の pwszName メンバに Unicode 文字列で指定できます。pIndexIDeKind メンバを DBKIND_NAME にする必要があります。

コンシューマは、インデックスに参加する列または複数の列を名前で指定します。CreateIndex で使用する DBINDEXCOLUMNDESC 構造体ごとに、pColumnIDeKind メンバを DBKIND_NAME にする必要があります。列の名前は、pColumnIDuName 共用体の pwszName メンバに Unicode 文字列で指定します。

SQL Server Native Client OLE DB プロバイダと SQL Server では、インデックス内の値には昇順の並べ替えがサポートされます。コンシューマがいずれかの DBINDEXCOLUMNDESC 構造体に DBINDEX_COL_ORDER_DESC を指定すると、SQL Server Native Client OLE DB プロバイダから E_INVALIDARG が返されます。

CreateIndex では、インデックスのプロパティが次のように解釈されます。

プロパティ ID

説明

DBPROP_INDEX_AUTOUPDATE

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_CLUSTERED

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : インデックスのクラスタ化を制御します。

VARIANT_TRUE: SQL Server Native Client OLE DB プロバイダにより、SQL Server テーブルにクラスタ化インデックスが作成されます。SQL Server では、どのテーブルでもクラスタ化インデックスは 1 つしかサポートされません。

VARIANT_FALSE: SQL Server Native Client OLE DB プロバイダにより、SQL Server テーブルに非クラスタ化インデックスが作成されます。

DBPROP_INDEX_FILLFACTOR

R/W: 読み取り/書き込み

既定値 : 0

説明 : インデックス ページの格納に使用する割合を指定します。詳細については、「CREATE INDEX」を参照してください。

バリアントの型は VT_I4 です。値は 1 ~ 100 にする必要があります。

DBPROP_INDEX_INITIALIZE

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_NULLCOLLATION

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_NULLS

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_PRIMARYKEY

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : 参照整合性 (PRIMARY KEY 制約) としてインデックスを作成します。

VARIANT_TRUE: インデックスは、テーブルの PRIMARY KEY 制約をサポートするために作成されます。列には NULL 値を許容しないでください。

VARIANT_FALSE: インデックスは、テーブル内の行値の PRIMARY KEY 制約としては使用されません。

DBPROP_INDEX_SORTBOOKMARKS

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_TEMPINDEX

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_TYPE

R/W: 読み取り/書き込み

既定値 : なし

説明 : SQL Server Native Client OLE DB プロバイダでは、このプロパティはサポートされません。CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。プロパティ構造体の dwStatus メンバには、DBPROPSTATUS_BADVALUE が示されます。

DBPROP_INDEX_UNIQUE

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : インデックスに参加する列または複数の列に、UNIQUE 制約としてインデックスを作成します。

VARIANT_TRUE: インデックスを使用して、テーブル内の行値を一意に制約します。

VARIANT_FALSE: インデックスでは、行値が一意に制約されません。

プロバイダ固有のプロパティ セット DBPROPSET_SQLSERVERINDEX には、SQL Server Native Client OLE DB プロバイダにより、次のデータ ソース情報のプロパティが定義されます。

プロパティ ID

説明

SSPROP_INDEX_XML

型 : VT_BOOL (R/W)

既定値 : VARIANT_FALSE

説明 : IIndexDefinition::CreateIndex のときに、このプロパティの値に VARIANT_TRUE を指定すると、インデックス対象の列に対応するプライマリ XML インデックスが作成されます。このプロパティが VARIANT_TRUE の場合、cIndexColumnDescs を 1 にする必要があります。それ以外の値を指定するとエラーが発生します。

次の例では、主キー インデックスを作成します。

// This CREATE TABLE statement shows the referential integrity and 
// PRIMARY KEY constraint on the OrderDetails table that will be created 
// by the following example code.
//
// CREATE TABLE OrderDetails
// (
//    OrderID      int      NOT NULL
//    ProductID   int      NOT NULL
//        CONSTRAINT PK_OrderDetails
//        PRIMARY KEY CLUSTERED (OrderID, ProductID),
//    UnitPrice   money      NOT NULL,
//    Quantity   int      NOT NULL,
//    Discount   decimal(2,2)   NOT NULL
//        DEFAULT 0
// )
//
HRESULT CreatePrimaryKey
    (
    IIndexDefinition* pIIndexDefinition
    )
    {
    HRESULT             hr = S_OK;

    DBID                dbidTable;
    DBID                dbidIndex;
    const ULONG         nCols = 2;
    ULONG               nCol;
    const ULONG         nProps = 2;
    ULONG               nProp;

    DBINDEXCOLUMNDESC   dbidxcoldesc[nCols];
    DBPROP              dbpropIndex[nProps];
    DBPROPSET           dbpropset;

    DBID*               pdbidIndexOut = NULL;

    // Set up identifiers for the table and index.
    dbidTable.eKind = DBKIND_NAME;
    dbidTable.uName.pwszName = L"OrderDetails";

    dbidIndex.eKind = DBKIND_NAME;
    dbidIndex.uName.pwszName = L"PK_OrderDetails";

    // Set up column identifiers.
    for (nCol = 0; nCol < nCols; nCol++)
        {
        dbidxcoldesc[nCol].pColumnID = new DBID;
        dbidxcoldesc[nCol].pColumnID->eKind = DBKIND_NAME;

        dbidxcoldesc[nCol].eIndexColOrder = DBINDEX_COL_ORDER_ASC;
        }
    dbidxcoldesc[0].pColumnID->uName.pwszName = L"OrderID";
    dbidxcoldesc[1].pColumnID->uName.pwszName = L"ProductID";

    // Set properties for the index. The index is clustered,
    // PRIMARY KEY.
    for (nProp = 0; nProp < nProps; nProp++)
        {
        dbpropIndex[nProp].dwOptions = DBPROPOPTIONS_REQUIRED;
        dbpropIndex[nProp].colid = DB_NULLID;

        VariantInit(&(dbpropIndex[nProp].vValue));
        
        dbpropIndex[nProp].vValue.vt = VT_BOOL;
        }
    dbpropIndex[0].dwPropertyID = DBPROP_INDEX_CLUSTERED;
    dbpropIndex[0].vValue.boolVal = VARIANT_TRUE;

    dbpropIndex[1].dwPropertyID = DBPROP_INDEX_PRIMARYKEY;
    dbpropIndex[1].vValue.boolVal = VARIANT_TRUE;

    dbpropset.rgProperties = dbpropIndex;
    dbpropset.cProperties = nProps;
    dbpropset.guidPropertySet = DBPROPSET_INDEX;

    hr = pIIndexDefinition->CreateIndex(&dbidTable, &dbidIndex, nCols,
        dbidxcoldesc, 1, &dbpropset, &pdbidIndexOut);

    // Clean up dynamically allocated DBIDs.
    for (nCol = 0; nCol < nCols; nCol++)
        {
        delete dbidxcoldesc[nCol].pColumnID;
        }

    return (hr);
    }

関連項目

概念