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

C++ 获取索引信息的问题-SQL Server,c++,sql,sql-server,visual-c++,odbc,C++,Sql,Sql Server,Visual C++,Odbc,尝试在SQLServer2012中获取表索引信息时,我发现了一个场景的奇怪情况 我有一个表,其中包含两个引用到某些字段的索引:映射到int上的Field_1和Field_3,空列。数字表示现有字段在几年前设计的表中的顺序 我试图通过以下方式获取有关这些索引的信息: nRetCode = ::SQLStatistics(hstmtAux, NULL, 0, NULL, 0, (TCHAR*)(LPCTSTR)strTempTable, SQL_NTS, SQL_INDEX_ALL, SQL_ENS

尝试在SQLServer2012中获取表索引信息时,我发现了一个场景的奇怪情况

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

我试图通过以下方式获取有关这些索引的信息:

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,但从我的兴趣角度来看,其行为是相同的

通常,我会获得有关索引的正确信息,但在一种情况下,我会遇到一种奇怪的行为。这是关于在场景中使用聚集索引

当字段_1为非唯一、非聚集且字段_3为聚集索引时,我得到了正确的信息

但是如果索引字段_1是聚集的,并且字段_3是非唯一的,非聚集的,我就得不到关于字段_1索引的任何信息,例如szIdxName和szIdxColName,它们的长度是-1,这意味着SQL_NULL_数据。 所以,我没有索引信息。在while循环中,通过下一次迭代,我获得了关于第二个索引字段_3的正确信息

我不确定问题是出在SQLStatistics、绑定还是SQLFetchScroll上,它们总是返回SQLU SUCCESS。第一个索引聚集时,驱动程序似乎有问题


有没有解决此问题的方法或检索索引信息的其他方法?

有文档记录了为“索引”名称或“列名”返回NULL的情况:

列名:列名。如果该列基于表达式,如薪资+福利,则返回该表达式;如果无法确定表达式,则返回空字符串。如果类型为SQL\u TABLE\u STAT,则返回NULL。 索引名称:索引名称;如果类型为SQL\u TABLE\u STAT,则返回NULL。
您确定没有在结果集中为表捕获自动创建的统计信息吗?swType的值是多少?您可以在中查看对象统计信息。

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

事实上,当swType为SQL\u TABLE\u STAT时,我没有索引或列的信息。对于好的场景,我观察到我的while循环有3次迭代,其中一次是swType=SQL\u TABLE\u STAT,而szIdxName中没有信息。但是对于糟糕的场景,循环只有2次迭代。因此,SQLExtendedFetch似乎没有单步执行一个索引。雷姆斯,关于你的问题,我没有潜得这么深。请你能更具体地说明你的意思吗?你可以在我的文章中找到更多关于这种方法的细节。