Поделиться через


Создание индексов SQL Server

Поставщик OLE DB собственного клиента SQL Server предоставляет функцию IIndexDefinition::CreateIndex , позволяющую потребителям определять новые индексы в таблицах SQL Server.

Поставщик OLE DB собственного клиента SQL Server создает табличные индексы в качестве индексов или ограничений. SQL Server предоставляет право создания ограничений владельцу таблицы, владельцу базы данных и членам некоторых ролей администрирования. По умолчанию только владелец таблицы может создавать в ней индекс. Таким образом, успех или сбой функции CreateIndex зависит не только от прав доступа пользователя приложения, но и от типа создаваемого индекса.

Пользователь задает имя таблицы в виде символьной строки в Юникоде в элементе pwszName объединения uName в параметре pTableID. Элемент eKind параметра pTableID должен быть равен DBKIND_NAME.

Параметр pIndexID может иметь значение NULL, и в этом случае поставщик OLE DB собственного клиента SQL Server создает для индекса уникальное имя. Потребитель может сам задать имя индекса, указав для DBID допустимый указатель в параметре ppIndexID.

Потребитель может задать имя индекса в виде символьной строки в Юникоде в элементе pwszName объединения uName параметра pIndexID. Элемент eKind параметра pIndexID должен быть равен DBKIND_NAME.

Потребитель указывает столбец или столбцы, входящие в индекс, по имени. Для каждой структуры DBINDEXCOLUMNDESC, используемой в функции CreateIndex, элемент eKind параметра pColumnID должен быть DBKIND_NAME. Имя столбца задается в виде символьной строки в Юникоде в элементе pwszName объединения uName параметра pColumnID.

Поставщик OLE DB собственного клиента SQL Server и SQL Server поддерживают возрастающий порядок значений в индексе. Поставщик OLE DB собственного клиента SQL Server возвращает значение E_INVALIDARG, если потребитель указывает значение DBINDEX_COL_ORDER_DESC в любой структуре DBINDEXCOLUMNDESC.

Функция CreateIndex интерпретирует свойства индекса следующим образом.

Cвойство

Описание

DBPROP_INDEX_AUTOUPDATE

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_CLUSTERED

Чтение-запись: чтение и запись

По умолчанию: VARIANT_FALSE

Описание: управляет кластеризацией индексов.

VARIANT_TRUE: Поставщик OLE DB собственного клиента SQL Server пытается создать кластеризованный индекс в таблице SQL Server. SQL Server поддерживает не более одного кластеризованного индекса в любой таблице.

VARIANT_FALSE: Поставщик OLE DB собственного клиента SQL Server пытается создать некластеризованный индекс в таблице SQL Server.

DBPROP_INDEX_FILLFACTOR

Чтение-запись: чтение и запись

По умолчанию: 0

Описание: указывает процентное соотношение страниц индекса, используемых для хранения. Дополнительные сведения см. в разделе CREATE INDEX.

Тип варианта — VT_I4. Значение должно находиться в диапазоне от 1 до 100.

DBPROP_INDEX_INITIALIZE

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLCOLLATION

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLS

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_PRIMARYKEY

Чтение-запись: чтение и запись

По умолчанию: Описание VARIANT_FALSE: создает индекс в виде ссылочной целостности, ограничение PRIMARY KEY.

VARIANT_TRUE: индекс создается для поддержки ограничения PRIMARY KEY таблицы. Столбцы не должны иметь значений NULL.

VARIANT_FALSE: индекс не используется в качестве ограничения PRIMARY KEY для значений строк таблицы.

DBPROP_INDEX_SORTBOOKMARKS

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TEMPINDEX

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TYPE

Чтение-запись: чтение и запись

По умолчанию: нет

Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_UNIQUE

Чтение-запись: чтение и запись

По умолчанию: VARIANT_FALSE

Описание: создает индекс в виде ограничения UNIQUE на определенном столбце или столбцах.

VARIANT_TRUE: Индекс используется для уникального ограничения значений строк таблицы.

VARIANT_FALSE: индекс не используется для уникального ограничения строк.

В зависящем от поставщика наборе свойств DBPROPSET_SQLSERVERINDEX поставщик OLE DB собственного клиента SQL Server определяет следующее свойство сведений об источнике данных.

Cвойство

Описание

SSPROP_INDEX_XML

Тип: VT_BOOL (R/W)

По умолчанию: VARIANT_FALSE

Описание: Если это свойство при вызове функции IIndexDefinition::CreateIndex указывается со значением VARIANT_TRUE, создается первичный XML-индекс, соответствующий индексированному столбцу. Если это свойство имеет значение VARIANT_TRUE, параметр cIndexColumnDescs должен быть равен 1. В противном случае возникает ошибка.

В данном примере создается индекс первичного ключа.

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

См. также

Основные понятия