Creazione di indici SQL Server
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
OLE DB Driver per SQL Server espone la funzione IIndexDefinition::CreateIndex, consentendo ai consumer di definire nuovi indici nelle tabelle di SQL Server.
OLE DB Driver per SQL Server crea gli indici di tabella come indici o vincoli. SQL Server concede il privilegio di creazione di vincoli al proprietario della tabella, al proprietario del database e ai membri di determinati ruoli amministrativi. Per impostazione predefinita, solo il proprietario di tabella può creare un indice in una tabella. L'esito positivo o negativo di CreateIndex dipende quindi non solo dai diritti di accesso dell'utente dell'applicazione ma anche dal tipo di indice creato.
I consumer specificano il nome della tabella come stringa di caratteri Unicode nel membro pwszName dell'unione uName nel parametro pTableID. Il membro eKind dipTableID deve essere DBKIND_NAME.
Il parametro pIndexID può essere NULL e, se lo è, il driver OLE DB per SQL Server crea un nome univoco per l'indice. Il consumer può acquisire il nome dell'indice specificando un puntatore valido a un DBID nel parametro ppIndexID.
Il consumer può specificare il nome dell'indice come stringa di caratteri Unicode nel membro pwszName dell'unione uName del parametro pTableID. Il membro eKind di pIndexID deve essere DBKIND_NAME.
Il consumer specifica la colonna o le colonne utilizzate nell'indice in base al nome. Per ogni struttura DBINDEXCOLUMNDESC usata in CreateIndex, il membro eKind di pColumnID deve essere DBKIND_NAME. Il nome della colonna viene specificato come stringa di caratteri Unicode nel membro pwszName dell'unione uName in pColumnID.
OLE DB Driver per SQL Server e SQL Server supportano l'ordine crescente nei valori dell'indice. Il driver OLE DB per SQL Server restituisce E_INVALIDARG se il consumer specifica DBINDEX_COL_ORDER_DESC in una qualsiasi struttura DBINDEXCOLUMNDESC.
CreateIndex interpreta le proprietà di indice come segue.
ID proprietà | Descrizione |
---|---|
DBPROP_INDEX_AUTOUPDATE | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_CLUSTERED | L/S: Lettura/Scrittura Impostazione predefinita: VARIANT_FALSE Descrizione: controlla il clustering dell'indice. VARIANT_TRUE: OLE DB Driver per SQL Server tenta di creare un indice cluster nella tabella di SQL Server. SQL Server supporta al massimo un indice cluster su una tabella. VARIANT_FALSE: OLE DB Driver per SQL Server tenta di creare un indice non cluster nella tabella di SQL Server. |
DBPROP_INDEX_FILLFACTOR | L/S: Lettura/Scrittura Predefinito: 0 Descrizione: specifica la percentuale di una pagina di indice utilizzata per l'archiviazione. Per altre informazioni, vedere CREATE INDEX. Il tipo della variante è VT_I4. Deve essere maggiore o uguale a 1 e minore o uguale a 100. |
DBPROP_INDEX_INITIALIZE | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLCOLLATION | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLS | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_PRIMARYKEY | L/S: Lettura/Scrittura Impostazione predefinita: descrizione VARIANT_FALSE: crea l'indice come integrità referenziale, vincolo PRIMARY KEY. VARIANT_TRUE: l'indice viene creato per supportare il vincolo PRIMARY KEY della tabella. È necessario che le colonne non ammettano valori Null. VARIANT_FALSE: l'indice non viene utilizzato come vincolo PRIMARY KEY per i valori di riga nella tabella. |
DBPROP_INDEX_SORTBOOKMARKS | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TEMPINDEX | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TYPE | L/S: Lettura/Scrittura Impostazione predefinita: nessuna Descrizione: il OLE DB Driver per SQL Server non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_UNIQUE | L/S: Lettura/Scrittura Impostazione predefinita: VARIANT_FALSE Descrizione: crea l'indice come vincolo UNIQUE nella colonna o nelle colonne utilizzate. VARIANT_TRUE: l'indice viene utilizzato per vincolare in modo univoco i valori della tabella. VARIANT_FALSE: l'indice non vincola in modo univoco i valori di riga. |
Nel set di proprietà DBPROPSET_SQLSERVERINDEX specifico del provider il driver OLE DB per SQL Server definisce la seguente proprietà delle informazioni sulle origini dati.
ID proprietà | Descrizione |
---|---|
SSPROP_INDEX_XML | Tipo: VT_BOOL (L/S) Impostazione predefinita: VARIANT_FALSE Descrizione: quando questa proprietà viene specificata con un valore VARIANT_TRUE con IIndexDefinition::CreateIndex, determina la creazione di un indice xml primario corrispondente alla colonna indicizzata. Se questa proprietà è VARIANT_TRUE, cIndexColumnDescs deve essere 1, in caso contrario si tratta di un errore. |
In questo esempio viene creato un indice di chiave primaria:
// 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);
}