创建 SQL Server 索引

SQL Server Native Client OLE DB 访问接口公开了 IIndexDefinition::CreateIndex 函数,从而允许使用者对 SQL Server 表定义新的索引。

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 访问接口将为索引创建一个唯一名称。通过在 ppIndexID 参数中指定一个指向 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 支持对任何表最多创建一个聚集索引。

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);
    }

请参阅

概念