Partilhar via


Criando índices do SQL Server

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

O Driver OLE DB para SQL Server expõe a função IIndexDefinition::CreateIndex , permitindo aos consumidores definir novos índices em tabelas SQL Server.

O Driver OLE DB para SQL Server cria índices de tabela como índices ou restrições. O SQL Server concede privilégio de criação de restrições ao proprietário da tabela, ao dono da base de dados e a membros de determinadas funções administrativas. Por defeito, só o proprietário da tabela pode criar um índice numa tabela. Portanto, o sucesso ou fracasso do CreateIndex depende não só dos direitos de acesso do utilizador da aplicação, mas também do tipo de índice criado.

Os consumidores especificam o nome da tabela como uma cadeia de caracteres Unicode no membro pwszName da união uName no parâmetro pTableID . O membro eKind do pTableID deve ser DBKIND_NAME.

O parâmetro pIndexID pode ser NULL e, se for, o Driver OLE DB para SQL Server cria um nome único para o índice. O consumidor pode capturar o nome do índice especificando um ponteiro válido para um DBID no parâmetro ppIndexID .

O consumidor pode especificar o nome do índice como uma cadeia de caracteres Unicode no membro pwszName da união uName do parâmetro pIndexID . O membro eKind do pIndexID deve ser DBKIND_NAME.

O consumidor especifica a coluna ou colunas participantes no índice pelo nome. Para cada estrutura DBINDEXCOLUMNDESC usada no CreateIndex, o membro eKind do pColumnID deve ser DBKIND_NAME. O nome da coluna é especificado como uma cadeia de caracteres Unicode no membro pwszName da união uName no pColumnID.

O Driver OLE DB para SQL Server e SQL Server suporta ordem crescente nos valores no índice. O Driver OLE DB para SQL Server devolve E_INVALIDARG se o consumidor especificar DBINDEX_COL_ORDER_DESC em qualquer estrutura DBINDEXCOLUMNDESC.

O CreateIndex interpreta as propriedades do índice da seguinte forma.

ID da Propriedade Description
DBPROP_INDEX_AUTOUPDATE R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_CLUSTERED R/W: Ler/Escrever

Padrão: VARIANT_FALSE

Descrição: Controla o agrupamento de índices.

VARIANT_TRUE: O Driver OLE DB para SQL Server tenta criar um índice clusterizado na tabela SQL Server. O SQL Server suporta, no máximo, um índice clusterizado em qualquer tabela.

VARIANT_FALSE: O Driver OLE DB para SQL Server tenta criar um índice não agrupado na tabela SQL Server.
DBPROP_INDEX_FILLFACTOR R/W: Ler/Escrever

Padrão: 0

Descrição: Especifica a percentagem de uma página de índice usada para armazenamento. Para obter mais informações, consulte CREATE INDEX.

O tipo da variante é VT_I4. O valor deve ser maior ou igual a 1 e menor ou igual a 100.
DBPROP_INDEX_INITIALIZE R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_NULLCOLLATION R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_NULLS R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_PRIMARYKEY R/W: Ler/Escrever

Padrão: VARIANT_FALSE Descrição: Cria o índice como uma restrição de integridade referencial, CHAVE PRIMÁRIA.

VARIANT_TRUE: O índice é criado para suportar a restrição PRIMARY KEY da tabela. As colunas devem ser não anuláveis.

VARIANT_FALSE: O índice não é usado como restrição de CHAVE PRIMÁRIA para valores de linha na tabela.
DBPROP_INDEX_SORTBOOKMARKS R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_TEMPINDEX R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_TYPE R/W: Ler/Escrever

Padrão: Nenhum

Descrição: O Driver OLE DB para SQL Server não suporta esta propriedade. Tentativas de definir a propriedade no CreateIndex causam um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura da propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_UNIQUE R/W: Ler/Escrever

Padrão: VARIANT_FALSE

Descrição: Cria o índice como uma restrição ÚNICA na coluna ou colunas participantes.

VARIANT_TRUE: O índice é usado para restringir de forma única os valores das linhas na tabela.

VARIANT_FALSE: O índice não restringe de forma única os valores das linhas.

No conjunto de propriedades específico do fornecedor DBPROPSET_SQLSERVERINDEX, o Driver OLE DB para SQL Server define a seguinte propriedade de informação da fonte de dados.

ID da Propriedade Description
SSPROP_INDEX_XML Tipo: VT_BOOL (R/W)

Padrão: VARIANT_FALSE

Descrição: Quando esta propriedade é especificada com um valor de VARIANT_TRUE com IIndexDefinition::CreateIndex, resulta na criação de um índice xml primário correspondente à coluna indexada. Se esta propriedade for VARIANT_TRUE, cIndexColumnDescs deve ser 1, caso contrário é um erro.

Este exemplo cria um índice de chave primária:

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

Ver também

Tabelas e índices