Создание индексов SQL Server
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
Драйвер OLE DB для SQL Server предоставляет функцию IIndexDefinition::CreateIndex , позволяя потребителям определять новые индексы в таблицах SQL Server.
OLE DB Driver for 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 интерпретирует свойства индекса указанным ниже образом.
Идентификатор свойства | Description |
---|---|
DBPROP_INDEX_AUTOUPDATE | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_CLUSTERED | R/W: чтение и запись По умолчанию: VARIANT_FALSE Описание. Управляет кластеризациям индексов. VARIANT_TRUE. Драйвер OLE DB для SQL Server пытается создать кластеризованный индекс в таблице SQL Server. SQL Server поддерживает не более одного кластеризованного индекса в любой таблице. VARIANT_FALSE. Драйвер OLE DB для SQL Server пытается создать некластеризованный индекс в таблице SQL Server. |
DBPROP_INDEX_FILLFACTOR | R/W: чтение и запись По умолчанию: 0 Описание: указывает процент страниц индекса, используемых для хранения. Дополнительные сведения см. в разделе CREATE INDEX. Тип варианта — VT_I4. Значение должно находиться в диапазоне от 1 до 100. |
DBPROP_INDEX_INITIALIZE | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLCOLLATION | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLS | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_PRIMARYKEY | R/W: чтение и запись По умолчанию: VARIANT_FALSE Описание: создает индекс в качестве ограничения целостности ссылочных данных, ограничения PRIMARY KEY. VARIANT_TRUE: индекс создается для поддержки ограничения PRIMARY KEY таблицы. Столбцы не должны иметь значений NULL. VARIANT_FALSE: индекс не используется в качестве ограничения PRIMARY KEY для значений строк таблицы. |
DBPROP_INDEX_SORTBOOKMARKS | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TEMPINDEX | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TYPE | R/W: чтение и запись По умолчанию: нет Описание. Драйвер OLE DB для SQL Server не поддерживает это свойство. Попытки установить свойство в CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_UNIQUE | R/W: чтение и запись По умолчанию: VARIANT_FALSE Описание: создает индекс в виде ограничения UNIQUE для определенного столбца или столбцов. VARIANT_TRUE: индекс используется для уникального ограничения значений в строках таблицы. VARIANT_FALSE: индекс не используется для уникального ограничения значений строк. |
В специфичном для каждого поставщика множестве свойств DBPROPSET_SQLSERVERINDEX драйвер OLE DB для SQL Server определяет указанное ниже свойство, хранящее информацию об источнике данных.
Идентификатор свойства | Description |
---|---|
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);
}