Partager via


Création d'index SQL Server

Le fournisseur OLE DB SQL Server Native Client expose la fonction IIndexDefinition::CreateIndex , en permettant aux consommateurs de définir de nouveaux index sur les tables SQL Server.

Le fournisseur OLE DB SQL Server Native Client crée les index de table comme index ou contraintes. SQL Server donne le privilège de création de contraintes au propriétaire de la table, au propriétaire de la base de données et aux membres de certains rôles d'administration. Par défaut, seul le propriétaire de la table peut créer un index sur une table. Par conséquent, le succès ou l'échec de DropIndex ne dépend pas uniquement des droits d'accès de l'utilisateur de l'application, mais également du type d'index créé.

Les consommateurs spécifient le nom de table comme une chaîne de caractères Unicode dans le membre pwszName de l'union uName dans le paramètre pTableID. Le membre eKind de pTableID doit être DBKIND_NAME.

Le paramètre pIndexID peut être NULL, et si tel est le cas, le fournisseur OLE DB SQL Server Native Client crée un nom unique pour l'index. Le consommateur peut capturer le nom de l'index en spécifiant un pointeur valide vers un DBID dans le paramètre ppIndexID.

Le consommateur peut spécifier le nom d'index comme chaîne de caractères Unicode dans le membre pwszName de l'union uName du paramètre pIndexID. Le membre eKind de pIndexID doit être DBKIND_NAME.

Le consommateur spécifie la colonne ou les colonnes qui participent à l'index par leur nom. Pour chaque structure DBINDEXCOLUMNDESC utilisée dans CreateIndex, le membre eKind de pColumnID doit être DBKIND_NAME. Le nom de la colonne est spécifié comme chaîne de caractères Unicode dans le membre pwszName de l'union uName de pColumnID.

Le fournisseur OLE DB SQL Server Native Client et SQL Server prennent en charge l'ordre croissant sur les valeurs de l'index. Le fournisseur OLE DB SQL Server Native Client retourne E_INVALIDARG si le consommateur spécifie DBINDEX_COL_ORDER_DESC dans une structure DBINDEXCOLUMNDESC.

CreateIndex interprète les propriétés d'index comme suit.

ID de propriété

Description

DBPROP_INDEX_AUTOUPDATE

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_CLUSTERED

R/W : lecture/écriture

Valeur par défaut : VARIANT_FALSE

Description : contrôle le clustering d'index.

VARIANT_TRUE : le fournisseur OLE DB SQL Server Native Client essaie de créer un index cluster sur la table SQL Server. SQL Server prend en charge au plus un index cluster sur une table.

VARIANT_FALSE : le fournisseur OLE DB SQL Server Native Client essaie de créer un index non cluster sur la table SQL Server.

DBPROP_INDEX_FILLFACTOR

R/W : lecture/écriture

Valeur par défaut : 0

Description : spécifie le pourcentage d'une page d'index utilisée pour le stockage. Pour plus d'informations, consultez CREATE INDEX.

Le type de la variante est VT_I4. La valeur doit être supérieure ou égale à 1 et inférieure ou égale à 100.

DBPROP_INDEX_INITIALIZE

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLCOLLATION

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLS

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_PRIMARYKEY

R/W : lecture/écriture

Valeur par défaut : VARIANT_FALSE Description : crée l'index comme intégrité référentielle, contrainte PRIMARY KEY.

VARIANT_TRUE : l'index est créé pour prendre en charge la contrainte PRIMARY KEY de la table. Les colonnes ne doivent pas accepter les valeurs null.

VARIANT_FALSE : l'index n'est pas utilisé comme contrainte PRIMARY KEY pour les valeurs de ligne de la table.

DBPROP_INDEX_SORTBOOKMARKS

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TEMPINDEX

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TYPE

R/W : lecture/écriture

Valeur par défaut : aucune

Description : le fournisseur OLE DB SQL Server Native Client ne prend pas en charge cette propriété. Les tentatives de définir la propriété dans CreateIndex provoquent une valeur de retour DB_S_ERRORSOCCURRED. Le membre dwStatus de la structure de propriété indique DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_UNIQUE

R/W : lecture/écriture

Valeur par défaut : VARIANT_FALSE

Description : crée l'index comme contrainte UNIQUE sur la colonne ou les colonnes participantes.

VARIANT_TRUE : l'index est utilisé pour définir une contrainte unique sur les valeurs de ligne de la table.

VARIANT_FALSE : l'index ne définit pas de contrainte unique sur les valeurs de ligne.

Dans le jeu de propriétés DBPROPSET_SQLSERVERINDEX spécifique au fournisseur, le fournisseur OLE DB SQL Server Native Client définit la propriété des informations de la source de données suivante.

ID de propriété

Description

SSPROP_INDEX_XML

Type : VT_BOOL (R/W)

Valeur par défaut : VARIANT_FALSE

Description : lorsque cette propriété est spécifiée avec la valeur VARIANT_TRUE avec IIndexDefinition::CreateIndex, il s'ensuit la création d'un index xml primaire, correspondant à la colonne indexée. Si cette propriété est VARIANT_TRUE, cIndexColumnDescs doit être 1, sinon, il s'agit d'une erreur.

Cet exemple crée un index de clé primaire :

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

Voir aussi

Concepts