Condividi tramite


Creazione di indici SQL Server

Il provider OLE DB di SQL Server Native Client espone la funzione IIndexDefinition::CreateIndex, consentendo ai consumer di definire nuovi indici nelle tabelle SQL Server.

Il provider OLE DB di SQL Server Native Client crea indici di tabella come indici o vincoli. In SQL Server viene concesso il privilegio di creazione dei vincoli al proprietario di tabella, al proprietario di 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, pertanto, 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 del parametro pTableID. Il membro eKind di pTableID deve essere DBKIND_NAME.

Il parametro pIndexID può essere NULL e, se lo è, il provider OLE DB di SQL Server Native Client 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 utilizzata 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.

Il provider OLE DB di SQL Server Native Client e SQL Server supportano l'ordine crescente nei valori dell'indice. Il provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client 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: il provider OLE DB di SQL Server Native Client prova a creare un indice cluster nella tabella SQL Server. SQL Server supporta al massimo un indice cluster in una tabella.

VARIANT_FALSE: il provider OLE DB di SQL Server Native Client tenta di creare un indice non cluster nella tabella SQL Server.

DBPROP_INDEX_FILLFACTOR

L/S: Lettura/scrittura

Impostazione predefinita: 0

Descrizione: specifica la percentuale di una pagina di indice utilizzata per l'archiviazione. Per ulteriori 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 provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client definisce la seguente proprietà delle informazioni relative all'origine 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);
    }

Vedere anche

Concetti