Creación de índices de SQL Server Native Client

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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

El proveedor OLE DB SQL Server Native Client crea índices de 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 ciertos roles administrativos. De forma predeterminada, solamente el propietario de la tabla puede crear un índice en una tabla. Por tanto, que la ejecución de CreateIndex sea correcta o no depende no solo 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 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 usada 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 SQL Server Native Client y SQL Server admiten el orden ascendente en los valores del índice. El proveedor OLE DB 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 R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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_CLUSTERED R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: VARIANT_FALSE

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

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

VARIANT_FALSE: el proveedor OLE DB de SQL Server Native Client intenta crear un índice no agrupado en la tabla SQL Server.
DBPROP_INDEX_FILLFACTOR R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: 0

Descripción: especifica el porcentaje de una página de índice usado 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 R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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_NULLCOLLATION R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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_NULLS R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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_PRIMARYKEY R (lectura) y W (escritura): Lectura/escritura

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

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

VARIANT_FALSE: el índice no se usa como una restricción PRIMARY KEY para los valores de fila de la tabla.
DBPROP_INDEX_SORTBOOKMARKS R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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_TEMPINDEX R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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 R (lectura) y W (escritura): Lectura/escritura

Valor predeterminado: None

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 R (lectura) y W (escritura): 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 usa 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 el conjunto de propiedades específico del proveedor DBPROPSET_SQLSERVERINDEX, el proveedor OLE DB de SQL Server Native Client define la siguiente propiedad de información del origen de datos.

Id. de propiedad Descripción
SSPROP_INDEX_XML Escriba: 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 indexa. 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);  
    }  

Consulte también

Tablas e índices