尝试在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
)。当第一个索引聚集时,它看起来像驱动程序的问题。
解决此问题的任何想法或检索索引信息的其他方法?
答案 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 表使用查询。