試圖獲取表索引信息SQL Server 2012
我發現了一個情況的奇怪情況。獲取索引信息的問題 - SQL Server
我有一個包含引用的一些領域兩個索引的表:Field_1和Field_3映射在INT,空列(數字意味着現有的字段順序到表設計幾年前...)。
我試圖獲取有關這些指標這樣的信息:)
nRetCode = ::SQLStatistics(hstmtAux, NULL, 0, NULL, 0, (TCHAR*)(LPCTSTR)strTempTable, SQL_NTS, SQL_INDEX_ALL, SQL_ENSURE);
if (nRetCode == SQL_SUCCESS || nRetCode == SQL_SUCCESS_WITH_INFO)
{
nRetCode = ::SQLBindCol(hstmtAux, 4, SQL_C_SHORT, &swNonUnique, sizeof(SWORD), &cbNonUnique);
nRetCode = ::SQLBindCol(hstmtAux, 5, SQL_CHAR, szIdxQualif, sizeof(CHAR) * 130, &cbIdxQualif);
nRetCode = ::SQLBindCol(hstmtAux, 6, SQL_C_CHAR, szIdxName, sizeof(CHAR) * 130, &cbIdxName);
nRetCode = ::SQLBindCol(hstmtAux, 7, SQL_C_SHORT, &swType, sizeof(SWORD), &cbType);
nRetCode = ::SQLBindCol(hstmtAux, 8, SQL_C_SHORT, &swSeqInIdx, sizeof(SWORD), &cbSeqInIdx);
nRetCode = ::SQLBindCol(hstmtAux, 9, SQL_C_CHAR, szIdxColName, sizeof(CHAR) * 130, &cbIdxColName);
while (bNoFetch || (nRetCode = ::SQLExtendedFetch(hstmtAux, SQL_FETCH_NEXT, 1, &crow, &rgfRowStatus)) == SQL_SUCCESS || nRetCode == SQL_SUCCESS_WITH_INFO)
{
if (cbIdxName != SQL_NULL_DATA && _tcslen((TCHAR)szIdxName) > 0)
{
// rest of the code
}
// the rest of the code
因爲SQLExtendedFetch(不贊成我用SQLFetchScroll讓()但行爲是從的觀點我的興趣點相同。
通常,我可以獲得有關索引的正確信息,但在某種情況下,我遇到了一個奇怪的行爲。這是關於將聚集索引放入場景中。
當Field_1是非唯一的非羣集和Field_3是Clusted指數我得到正確的信息。
但如果指數Field_1是集羣和Field_3是非唯一的非羣集我沒有得到任何有關Field_1索引信息(如szIdxName和szIdxColName是「」和它們的長度爲-1是手段SQL_NULL_DATA
)。 所以,我沒有索引信息。在while循環內,通過下一次迭代,我可以獲得有關第二個索引Field_3的正確信息。
我不確定問題出在SQLStatistics,綁定還是SQLFetchScroll
(它們總是返回SQL_SUCCESS
)。當第一個索引被聚集時,它看起來像是驅動程序的問題。
任何想法解決這個問題或替代方式來檢索索引信息?
事實上,當swType是SQL_TABLE_STAT我沒有索引或列的信息。 對於良好的場景,我觀察到我的while循環有3次迭代,其中包括swType = SQL_TABLE_STAT,其中沒有szIdxName中的信息。但是對於不好的情況,循環只有2次迭代。所以它看起來像SQLExtendedFetch()不是爲一個索引步進。 Remus,與你的問題有關,我沒有深入這麼深。請,你能更具體地說明你的意思嗎? – Silviu