Freigeben über


Erstellen von SQL Server-Indizes

Der SQL Server Native Client OLE DB-Anbieter macht die IIndexDefinition::CreateIndex -Funktion verfügbar und ermöglicht es Consumern, neue Indizes für SQL Server-Tabellen zu erstellen.

Die Tabellenindizes werden vom SQL Server Native Client OLE DB-Anbieter entweder als Indizes oder als Einschränkungen erstellt. SQL Server gewährt dem Tabellenbesitzer, dem Datenbankbesitzer und Mitgliedern bestimmter administrativer Rollen Privilegien zum Erstellen von Einschränkungen. Standardmäßig kann nur der Tabellenbesitzer einen Index für eine Tabelle erstellen. Aus diesem Grund hängt es nicht nur von den Zugriffsrechten des Anwendungsbenutzers, sondern auch von der Art des erstellten Indexes ab, ob CreateIndex erfolgreich verläuft oder fehlschlägt.

Consumer geben den Tabellennamen als Unicode-Zeichenfolge in das pwszName -Element der uName-Vereinigung des pTableID-Parameters ein. Das eKind-Element von pTableID muss DBKIND_NAME sein.

Der pIndexID-Parameter kann NULL sein. In diesem Fall erstellt der SQL Server Native Client OLE DB-Anbieter einen eindeutigen Namen für den Index. Der Consumer kann den Namen des Indexes aufzeichnen, indem er einen gültigen Zeiger auf eine DBID im ppIndexID-Parameter angibt.

Der Consumer kann den Indexnamen als Unicode-Zeichenfolge in das pwszName -Element der uName-Vereinigung des pIndexID-Parameters eingeben. Das eKind -Element von pIndexID muss DBKIND_NAME sein.

Der Consumer gibt die Spalte oder die Spalten an, die namentlich in den Index einbezogen werden. Für jede DBINDEXCOLUMNDESC-Struktur, die in CreateIndex verwendet wird, muss das eKind-Element der pColumnID DBKIND_NAME sein. Der Name der Spalte wird als Unicode-Zeichenfolge in das pwszName -Element der uName-Vereinigung des pColumnID-Parameters eingegeben.

Der SQL Server Native Client OLE Datenbank-Anbieter und SQL Server unterstützen die aufsteigende Reihenfolge von Werten im Index. Der SQL Server Native Client OLE DB-Anbieter gibt E_INVALIDARG zurück, wenn der Consumer in einer DBINDEXCOLUMNDESC-Spalte DBINDEX_COL_ORDER_DESC angibt.

CreateIndex interpretiert Indexeigenschaften wie folgt.

Eigenschafts-ID

Beschreibung

DBPROP_INDEX_AUTOUPDATE

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_CLUSTERED

R/W: Lesen/Schreiben

Standard: VARIANT_FALSE

Beschreibung: Steuert die Indexgruppierung.

VARIANT_TRUE: Der SQL Server Native Client OLE Datenbank-Anbieter versucht, einen gruppierten Index für die SQL Server-Tabelle zu erstellen. SQL Server unterstützt nur einen gruppierten Index pro Tabelle.

VARIANT_FALSE: Der SQL Server Native Client OLE Datenbank-Anbieter versucht, einen nicht gruppierten Index für die SQL Server-Tabelle zu erstellen.

DBPROP_INDEX_FILLFACTOR

R/W: Lesen/Schreiben

Standard: 0

Beschreibung: Gibt den Prozentsatz einer für Speicher verwendeten Indexseite an. Weitere Informationen finden Sie unter CREATE INDEX.

Der Typ der Variante ist VT_I4. Der Wert muss größer als oder gleich 1 und kleiner als oder gleich 100 sein.

DBPROP_INDEX_INITIALIZE

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_NULLCOLLATION

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_NULLS

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_PRIMARYKEY

R/W: Lesen/Schreiben

Standard: VARIANT_FALSE Beschreibung: Erstellt den Index als PRIMARY KEY-Einschränkung mit referenzieller Integrität.

VARIANT_TRUE: Der Index wird erstellt, um die PRIMARY KEY-Einschränkung der Tabelle zu unterstützen. Die Spalten dürfen keine NULL-Werte zulassen.

VARIANT_FALSE: Der Index wird nicht als PRIMARY KEY-Einschränkung für Zeilenwerte in der Tabelle verwendet.

DBPROP_INDEX_SORTBOOKMARKS

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_TEMPINDEX

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_TYPE

R/W: Lesen/Schreiben

Standardwert: keiner

Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an.

DBPROP_INDEX_UNIQUE

R/W: Lesen/Schreiben

Standard: VARIANT_FALSE

Beschreibung: Erstellt den Index als UNIQUE-Einschränkung für die einbezogene(n) Spalte oder Spalten.

VARIANT_TRUE: Der Index wird verwendet, um Zeilenwerte in der Tabelle eindeutig einzuschränken.

VARIANT_FALSE: Der Index schränkt Zeilenwerte nicht eindeutig ein.

Im anbieterspezifischen Eigenschaftensatz DBPROPSET_SQLSERVERINDEX definiert der SQL Server Native Client OLE DB-Anbieter die folgende Eigenschaft für Datenquelleninformationen.

Eigenschafts-ID

Beschreibung

SSPROP_INDEX_XML

Typ: VT_BOOL (R/W)

Standard: VARIANT_FALSE

Beschreibung: Wenn diese Eigenschaft mit dem Wert VARIANT_TRUE mit IIndexDefinition::CreateIndex angegeben wird, wird ein primärer XML-Index erstellt, der der zu indizierenden Spalte entspricht. Wenn diese Eigenschaft VARIANT_TRUE ist, sollte cIndexColumnDescs 1 sein; andernfalls tritt ein Fehler auf.

In diesem Beispiel wird ein Primärschlüsselindex erstellt:

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

Siehe auch

Konzepte