Création d’index SQL Server Native Client

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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

Le fournisseur OLE DB SQL Server Native Client crée des index de table sous forme d’index ou de 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 CreateIndex 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 en tant que 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, le cas échéant, 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 pwszNamede l’union uName de pColumnID.

Le SQL Server Native Client fournisseur OLE DB 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 de la façon suivante :

ID de propriété Description
DBPROP_INDEX_AUTOUPDATE R/W : Lecture/écriture

Valeur par défaut : None

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 tente 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 tente 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 : None

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 : None

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 : None

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 : Description de VARIANT_FALSE : 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 : None

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 : None

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 : None

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 spécifique au fournisseur DBPROPSET_SQLSERVERINDEX, le fournisseur OLE DB SQL Server Native Client définit la propriété d’informations de source de données suivante.

ID de propriété Description
SSPROP_INDEX_XML Tapez : 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

Tables et index