2014-01-06 81 views
0

試圖獲取表索引信息SQL Server 2012我發現了一個情況的奇怪情況。獲取索引信息的問題 - SQL Server

我有一個包含引用的一些領域兩個索引的表:Field_1Field_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)。當第一個索引被聚集時,它看起來像是驅動程序的問題。

任何想法解決這個問題或替代方式來檢索索引信息?

回答

0

有記載的SQLStatistics爲 '索引' 名稱或 '列名' 返回NULL情況:

  • COLUMN_NAME:列名。如果該列基於表達式(例如SALARY + BENEFITS),則返回該表達式;如果表達式無法確定,則返回空字符串。 如果TYPE爲SQL_TABLE_STAT,則返回NULL。
  • INDEX_NAME:Index name; 如果TYPE爲SQL_TABLE_STAT,則返回NULL。

你確定你沒有捕捉在搜索結果表自動創建的統計數據集? swType是什麼值?您可以在sys.stats中查看對象統計信息。

+0

事實上,當swType是SQL_TABLE_STAT我沒有索引或列的信息。 對於良好的場景,我觀察到我的while循環有3次迭代,其中包括swType = SQL_TABLE_STAT,其中沒有szIdxName中的信息。但是對於不好的情況,循環只有2次迭代。所以它看起來像SQLExtendedFetch()不是爲一個索引步進。 Remus,與你的問題有關,我沒有深入這麼深。請,你能更具體地說明你的意思嗎? – Silviu

0

我解決了它的解決方法:使用查詢通過sys.tablessys。索引表。

+0

您可以在我的[文章]中找到關於此方法的更多詳細信息(http://silviuardelean.ro/2014/04/07/getting-tables-indexes-experiences-workaround/)。 – Silviu