建立 SQL Server 索引
適用於:SQL Server Azure SQL 資料 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
OLE DB Driver for SQL Server 會公開 IIndexDefinition::CreateIndex 函數,讓取用者定義 SQL Server 資料表的新索引。
OLE DB Driver for SQL Server 會建立資料表索引作為索引或條件約束。 SQL Server 會將建立條件約束的權限提供給資料表擁有者、資料庫擁有者,以及特定系統管理角色的成員。 根據預設,只有資料表擁有者可以建立資料表的索引。 因此,CreateIndex 的成功或失敗,不但取決於應用程式使用者的存取權限,也取決於所建立之索引的類型。
取用者會在 pTableID 參數中,將資料表名稱指定為 uName 聯集之 pwszName 成員中的 Unicode 字元字串。 pTableID 的 eKind 成員必須是 DBKIND_NAME。
當 pIndexID 參數為 NULL 時,OLE DB Driver for SQL Server 會針對索引建立一個唯一的名稱。 取用者可以在 ppIndexID 參數中指定 DBID 的有效指標,藉以擷取索引的名稱。
取用者可以將索引名稱指定為 pIndexID 參數 uName 聯集之 pwszName 成員中的 Unicode 字元字串。 pIndexID 的 eKind 成員必須是 DBKIND_NAME。
取用者會指定依名稱參與索引的一或多個資料行。 對於在 CreateIndex 中使用的每個 DBINDEXCOLUMNDESC 結構,pColumnID 的 eKind 成員必須是 DBKIND_NAME。 在 pColumnID 中,資料行的名稱會指定為 uName 聯集之 pwszName 成員內的 Unicode 字元字串。
OLE DB Driver for SQL Server 與 SQL Server 針對索引中的值支援遞增順序。 如果取用者在任何 DBINDEXCOLUMNDESC 結構中指定 DBINDEX_COL_ORDER_DESC,OLE DB Driver for SQL Server 會傳回 E_INVALIDARG。
CreateIndex 會解譯索引屬性,如下所示。
屬性識別碼 | 描述 |
---|---|
DBPROP_INDEX_AUTOUPDATE | R/W︰讀取/寫入 預設值:None 描述:OLE DB Driver for SQL Server 不支援這個屬性。 嘗試在 CreateIndex 中設定屬性會使 DB_S_ERRORSOCCURRED 傳回值。 屬性結構的 dwStatus 成員表示 DBPROPSTATUS_BADVALUE。 |
DBPROP_INDEX_CLUSTERED | R/W︰讀取/寫入 預設值:VARIANT_FALSE 描述:控制索引叢集。 VARIANT_TRUE:OLE DB Driver for SQL Server 會嘗試在 SQL Server 資料表上建立叢集索引。 SQL Server 在任何資料表上,最多支援一個叢集索引。 VARIANT_FALSE:OLE DB Driver for SQL Server 會嘗試在 SQL Server 資料表上建立非叢集索引。 |
DBPROP_INDEX_FILLFACTOR | R/W︰讀取/寫入 預設值:0 描述:指定用於儲存之索引頁面的百分比。 如需詳細資訊,請參閱 CREATE INDEX。 變數的類型為 VT_I4。 其值必須大於或等於 1 且小於或等於 100。 |
DBPROP_INDEX_INITIALIZE | R/W︰讀取/寫入 預設值:None 描述:OLE DB Driver for SQL Server 不支援這個屬性。 嘗試在 CreateIndex 中設定屬性會使 DB_S_ERRORSOCCURRED 傳回值。 屬性結構的 dwStatus 成員表示 DBPROPSTATUS_BADVALUE。 |
DBPROP_INDEX_NULLCOLLATION | R/W︰讀取/寫入 預設值:None 描述:OLE DB Driver for SQL Server 不支援這個屬性。 嘗試在 CreateIndex 中設定屬性會使 DB_S_ERRORSOCCURRED 傳回值。 屬性結構的 dwStatus 成員表示 DBPROPSTATUS_BADVALUE。 |
DBPROP_INDEX_NULLS | R/W︰讀取/寫入 預設值:None 描述:OLE DB Driver for 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︰讀取/寫入 預設值:None 描述:OLE DB Driver for SQL Server 不支援這個屬性。 嘗試在 CreateIndex 中設定屬性會使 DB_S_ERRORSOCCURRED 傳回值。 屬性結構的 dwStatus 成員表示 DBPROPSTATUS_BADVALUE。 |
DBPROP_INDEX_TEMPINDEX | R/W︰讀取/寫入 預設值:None 描述:OLE DB Driver for SQL Server 不支援這個屬性。 嘗試在 CreateIndex 中設定屬性會使 DB_S_ERRORSOCCURRED 傳回值。 屬性結構的 dwStatus 成員表示 DBPROPSTATUS_BADVALUE。 |
DBPROP_INDEX_TYPE | R/W︰讀取/寫入 預設值:None 描述:OLE DB Driver for 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 Driver for SQL Server 會定義下列資料來源資訊屬性。
屬性識別碼 | 描述 |
---|---|
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);
}