Compartir a través de


Crear índices de SQL Server

El proveedor OLE DB de SQL Server Native Client expone la función IIndexDefinition::CreateIndex , que permite a los consumidores definir índices nuevos en las tablas de SQL Server.

El proveedor OLE DB de SQL Server Native Client crea los índices de la tabla como índices o restricciones. SQL Server da privilegio de creación de restricciones al propietario de la tabla, el propietario de la base de datos y los miembros de ciertas funciones administrativas. De forma predeterminada, sólo el propietario de la tabla puede crear un índice en una tabla. Por consiguiente, que la ejecución de CreateIndex sea correcta o no depende no sólo de los derechos de acceso del usuario de la aplicación sino también del tipo de índice creado.

Los consumidores especifican el nombre de tabla como una cadena de caracteres Unicode en el miembro pwszName de la unión uName en el parámetro pTableID. El miembro eKind de pTableID debe ser DBKIND_NAME.

El parámetro pIndexID puede ser NULL y si es así, el proveedor OLE DB de SQL Server Native Client crea un nombre único para el índice. El consumidor puede capturar el nombre del índice especificando un puntero válido a un DBID en el parámetro ppIndexID.

El consumidor puede especificar el nombre del índice como una cadena de caracteres Unicode en el miembro pwszName de la unión del uName del parámetro pIndexID. El miembro eKind de pIndexID debe ser DBKIND_NAME.

El consumidor especifica la columna o columnas que participan en el índice por nombre. Para cada estructura de DBINDEXCOLUMNDESC utilizada en CreateIndex, el miembro eKind de pColumnID debe ser DBKIND_NAME. El nombre de la columna se especifica como una cadena de caracteres Unicode en el miembro pwszName de la unión uName en pColumnID.

El proveedor OLE DB de SQL Server Native Client y SQL Server admiten el orden ascendente en los valores del índice. El proveedor OLE DB de SQL Server Native Client devuelve E_INVALIDARG si el consumidor especifica DBINDEX_COL_ORDER_DESC en cualquier estructura DBINDEXCOLUMNDESC.

CreateIndex interpreta las propiedades del índice como sigue.

Id. de propiedad

Descripción

DBPROP_INDEX_AUTOUPDATE

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_CLUSTERED

L/E: lectura/escritura

Valor predeterminado: VARIANT_FALSE

Descripción: controla la agrupación en clústeres de índices.

VARIANT_TRUE: el proveedor OLE DB de SQL Server Native Client intenta crear un índice en clúster en la tabla SQL Server. SQL Server admite a lo sumo un índice en clúster en cualquier tabla.

VARIANT_FALSE: el proveedor OLE DB de SQL Server Native Client intenta crear un índice no clúster en la tabla SQL Server.

DBPROP_INDEX_FILLFACTOR

L/E: lectura/escritura

Valor predeterminado: 0

Descripción: especifica el porcentaje de una página de índice utilizado para el almacenamiento. Para obtener más información, vea CREATE INDEX.

El tipo del variant es VT_I4. El valor debe ser mayor o igual que 1 y menor o igual que 100.

DBPROP_INDEX_INITIALIZE

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLCOLLATION

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLS

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado la devolución del valor DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_PRIMARYKEY

L/E: lectura/escritura

Valor predeterminado: VARIANT_FALSE. Descripción: crea el índice como una integridad referencial, restricción PRIMARY KEY.

VARIANT_TRUE: el índice se crea para admitir la restricción PRIMARY KEY de la tabla. Las columnas no deben aceptar valores NULL.

VARIANT_FALSE: el índice no se utiliza como una restricción PRIMARY KEY para los valores de fila de la tabla.

DBPROP_INDEX_SORTBOOKMARKS

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado la devolución del valor DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TEMPINDEX

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex producen un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TYPE

L/E: lectura/escritura

Valor predeterminado: ninguno

Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex producen un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_UNIQUE

L/E: lectura/escritura

Valor predeterminado: VARIANT_FALSE

Descripción: crea el índice como una restricción UNIQUE en la columna o columnas participantes.

VARIANT_TRUE: el índice se utiliza para restringir de forma única los valores de fila de la tabla.

VARIANT_FALSE: el índice no restringe de forma exclusiva los valores de fila.

En la propiedad específica del proveedor establezca DBPROPSET_SQLSERVERINDEX, el proveedor OLE DB de SQL Server Native Client define la propiedad de información de origen de datos siguiente.

Id. de propiedad

Descripción

SSPROP_INDEX_XML

Tipo: VT_BOOL (L/E)

Valor predeterminado: VARIANT_FALSE

Descripción: cuando esta propiedad se especifica con un valor de VARIANT_TRUE con IIndexDefinition::CreateIndex, da como resultado la creación de un índice xml primario correspondiente a la columna que se está indizando. Si esta propiedad es VARIANT_TRUE, cIndexColumnDescs debe ser 1, de lo contrario es un error.

En este ejemplo se crea un índice de la clave principal:

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

Vea también

Conceptos