Erstellen von SQL Server-Indizes
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Der OLE DB-Treiber für SQL Server macht die Funktion IIndexDefinition::CreateIndex verfügbar und ermöglicht es Consumern, neue Indizes für SQL Server-Tabellen zu erstellen.
Der OLE DB-Treiber für SQL Server erstellt Tabellenindizes entweder als Indizes oder als Einschränkungen. SQL Server gewährt dem Tabellenbesitzer, Datenbankbesitzer und Mitgliedern bestimmter Administratorrollen die Berechtigung 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 Parameter pIndexID kann NULL sein. In diesem Fall erstellt der OLE DB-Treiber für SQL Server 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 Parameter ppIndexID angibt.
Der Consumer kann den Indexnamen als Unicode-Zeichenfolge in das Element pwszName der Vereinigung uName des Parameters pIndexID 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 Element eKind der pColumnID DBKIND_NAME sein. Der Name der Spalte wird als Unicode-Zeichenfolge in das Element pwszName der Vereinigung uName des Parameters pColumnID eingegeben.
Der OLE DB-Treiber für SQL Server und SQL Server unterstützen die aufsteigende Reihenfolge für Werte im Index. Der OLE DB-Treiber für SQL Server 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: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_CLUSTERED | R/W: Lesen/Schreiben Standardwert: VARIANT_FALSE Beschreibung: Steuert die Indexgruppierung VARIANT_TRUE: Der OLE DB-Treiber für SQL Server versucht, einen gruppierten Index für die SQL Server-Tabelle zu erstellen. SQL Server unterstützt maximal einen gruppierten Index pro Tabelle. VARIANT_FALSE: Der OLE DB-Treiber für SQL Server versucht, einen nicht gruppierten Index für die SQL Server-Tabelle zu erstellen. |
DBPROP_INDEX_FILLFACTOR | R/W: Lesen/Schreiben Standardwert: 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: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_NULLCOLLATION | R/W: Lesen/Schreiben Standardwert: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_NULLS | R/W: Lesen/Schreiben Standardwert: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_PRIMARYKEY | R/W: Lesen/Schreiben Standardwert: VARIANT_FALSE Beschreibung: Erstellt den Index als PRIMARY KEY-Einschränkung mit referentieller 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: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_TEMPINDEX | R/W: Lesen/Schreiben Standardwert: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_TYPE | R/W: Lesen/Schreiben Standardwert: Keine Beschreibung: Der OLE DB-Treiber für SQL Server unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das Element dwStatus der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_UNIQUE | R/W: Lesen/Schreiben Standardwert: 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 OLE DB-Treiber für SQL Server die folgende Eigenschaft für Datenquelleninformationen.
Eigenschafts-ID | BESCHREIBUNG |
---|---|
SSPROP_INDEX_XML | Typ: VT_BOOL (R/W) Standardwert: 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);
}