获取索引信息的问题 - SQL Server

时间:2014-01-06 11:32:48

标签: c++ sql sql-server visual-c++ odbc

尝试在SQL Server 2012中获取表索引信息我发现了一个奇怪的情况。

我有一个表,其中包含两个引用某些字段的索引: Field_1 Field_3 映射到int,null列(数字表示现有的字段顺序到表中几年前设计的......)。

我正在尝试获取有关这些索引的信息:

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 是Clustered且 Field_3 是非唯一的,非群集我得不到有关Field_1索引的信息(例如,szIdxName和szIdxColName是“ “它们的长度为-1表示SQL_NULL_DATA)。 所以,我没有索引信息。在while循环中,在下一次迭代中,我得到关于第二个索引 Field_3 的正确信息。

我不确定问题是SQLStatistics,绑定还是SQLFetchScroll(它们都返回SQL_SUCCESS)。当第一个索引聚集时,它看起来像驱动程序的问题。

解决此问题的任何想法或检索索引信息的其他方法?

2 个答案:

答案 0 :(得分:0)

有记录显示SQLStatistics为'index'名称或'列名'返回NULL:

  
      
  • COLUMN_NAME:列名。如果列基于表达式,例如SALARY + BENEFITS,则返回表达式;如果无法确定表达式,则返回空字符串。 如果TYPE为SQL_TABLE_STAT ,则返回NULL。
  •   
  • INDEX_NAME:索引名称; 如果TYPE为SQL_TABLE_STAT ,则返回NULL。
  •   

您确定没有捕获结果集中表格的自动创建统计数据吗? swType的价值是多少?您可以在sys.stats中查看对象统计信息。

答案 1 :(得分:0)

我通过解决方法解决了这个问题:通过 sys.tables sys.indexes 表使用查询。

相关问题