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)

Download del driver OLE DB

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

Vedi anche

Tabelle e indici