SQL Server-indexen maken

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform Systeem (PDW)SQL-database in Microsoft Fabric

OLE DB-stuurprogramma downloaden

De OLE DB-driver voor SQL Server maakt de IIndexDefinition::CreateIndex-functie beschikbaar, waardoor consumenten nieuwe indexen op SQL Server-tabellen kunnen definiëren.

De OLE DB-driver voor SQL Server maakt tabelindexen aan als indexen of beperkingen. SQL Server geeft het recht om beperkingen te creëren aan de tabeleigenaar, database-eigenaar en leden van bepaalde administratieve rollen. Standaard kan alleen de tabeleigenaar een index op een tabel aanmaken. Daarom hangt het succes of falen van CreateIndex niet alleen af van de toegangsrechten van de applicatiegebruiker, maar ook van het type aangemaakte index.

Consumenten specificeren de tabelnaam als een Unicode-tekenstring in het pwszName-lid van de uName-unie in de pTableID-parameter . Het eKind-lid van pTableID moet DBKIND_NAME zijn.

De pIndexID-parameter kan NULL zijn, en als dat zo is, maakt de OLE DB Driver voor SQL Server een unieke naam aan voor de index. De consument kan de naam van de index vastleggen door een geldige pointer naar een DBID te specificeren in de ppIndexID-parameter .

De consument kan de indexnaam specificeren als een Unicode-tekenstring in het pwszName-lid van de uName-unie van de pIndexID-parameter . Het eKind-lid van pIndexID moet DBKIND_NAME zijn.

De consument specificeert de kolom of kolommen die aan de index deelnemen bij naam. Voor elke DBINDEXCOLUMNDESC-structuur die in CreateIndex wordt gebruikt, moet het eKind-lid van de pColumnID DBKIND_NAME zijn. De naam van de kolom wordt gespecificeerd als een Unicode-tekenreeks in het pwszName-lid van de uName-unie in de pColumnID.

De OLE DB-driver voor SQL Server en SQL Server ondersteunt oplopende volgorde van waarden in de index. De OLE DB-driver voor SQL Server geeft E_INVALIDARG terug als de consument DBINDEX_COL_ORDER_DESC specificeert in een DBINDEXCOLUMNDESC-structuur.

CreateIndex interpreteert indexeigenschappen als volgt.

Eigenschaps-id Description
DBPROP_INDEX_AUTOUPDATE R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_CLUSTERED R/W: Lezen/schrijven

Standaard: VARIANT_FALSE

Beschrijving: Beheerst indexclustering.

VARIANT_TRUE: De OLE DB-driver voor SQL Server probeert een geclusterde index op de SQL Server-tabel te maken. SQL Server ondersteunt hooguit één geclusterde index op elke tabel.

VARIANT_FALSE: De OLE DB Driver voor SQL Server probeert een niet-geclusterde index te creëren op de SQL Server-tabel.
DBPROP_INDEX_FILLFACTOR R/W: Lezen/schrijven

Standaardwaarde: 0

Beschrijving: Specificeert het percentage van een indexpagina dat voor opslag wordt gebruikt. Zie CREATE INDEX voor meer informatie.

Het type variant is VT_I4. De waarde moet groter zijn dan of gelijk aan 1 en kleiner dan of gelijk aan 100.
DBPROP_INDEX_INITIALIZE R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_NULLCOLLATION R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_NULLS R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_PRIMARYKEY R/W: Lezen/schrijven

Standaard: VARIANT_FALSE Beschrijving: Maakt de index aan als een referentieintegriteitsbeperking, PRIMARY KEY.

VARIANT_TRUE: De index is gemaakt om de PRIMARY KEY-beperking van de tabel te ondersteunen. De kolommen moeten niet-nulleerbaar zijn.

VARIANT_FALSE: De index wordt niet gebruikt als een PRIMAIRE KEY-beperking voor rijwaarden in de tabel.
DBPROP_INDEX_SORTBOOKMARKS R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_TEMPINDEX R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_TYPE R/W: Lezen/schrijven

Standaard: Geen

Beschrijving: De OLE DB-driver voor SQL Server ondersteunt deze eigenschap niet. Pogingen om de eigenschap in CreateIndex in te stellen veroorzaken een DB_S_ERRORSOCCURRED returnwaarde. Het dwStatus-lid van de eigendomsstructuur geeft DBPROPSTATUS_BADVALUE aan.
DBPROP_INDEX_UNIQUE R/W: Lezen/schrijven

Standaard: VARIANT_FALSE

Beschrijving: Maakt de index aan als een UNIEKE beperking op de deelnemende kolom of kolommen.

VARIANT_TRUE: De index wordt gebruikt om rijwaarden in de tabel uniek te beperken.

VARIANT_FALSE: De index beperkt rijwaarden niet eenduidig.

In de provider-specifieke eigenschapsset DBPROPSET_SQLSERVERINDEX definieert de OLE DB Driver voor SQL Server de volgende eigenschap van gegevensbroninformatie.

Eigenschaps-id Description
SSPROP_INDEX_XML Type: VT_BOOL (R/W)

Standaard: VARIANT_FALSE

Beschrijving: Wanneer deze eigenschap wordt gespecificeerd met een waarde van VARIANT_TRUE met IIndexDefinition::CreateIndex, wordt er een primaire xml-index aangemaakt die overeenkomt met de kolom die geïndexeerd wordt. Als deze eigenschap VARIANT_TRUE is, moet cIndexColumnDescs 1 zijn, anders is het een fout.

Dit voorbeeld creëert een primaire sleutelindex:

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

Zie ook

Tabellen en indexen