SQLStatistics 函数

一致性
引入的版本:ODBC 1.0 标准符合性:ISO 92

摘要
SQLStatistics 检索有关单个表以及与该表关联的索引的统计信息列表。 驱动程序将信息作为结果集返回。

语法

  
SQLRETURN SQLStatistics(  
     SQLHSTMT        StatementHandle,  
     SQLCHAR *       CatalogName,  
     SQLSMALLINT     NameLength1,  
     SQLCHAR *       SchemaName,  
     SQLSMALLINT     NameLength2,  
     SQLCHAR *       TableName,  
     SQLSMALLINT     NameLength3,  
     SQLUSMALLINT    Unique,  
     SQLUSMALLINT    Reserved);  

参数

StatementHandle
[输入]语句句柄。

CatalogName
[输入]目录名称。 如果驱动程序支持某些表的目录,但不支持其他表的目录,例如当驱动程序从不同的 DBMS 检索数据时,空字符串 (“”) 指示那些没有目录的表。 CatalogName 不能包含字符串搜索模式。

如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 CatalogName 被视为标识符,其大小写不重要。 如果它是SQL_FALSE, 则 CatalogName 是一个普通参数;它按字面处理,其大小写很重要。 有关详细信息,请参阅 目录函数中的参数

NameLength1
[输入]*CatalogName 的长度(以字符为单位)。

SchemaName
[输入]架构名称。 如果驱动程序支持某些表的架构,但不支持其他表的架构,例如,当驱动程序从不同的 DBMS 检索数据时,空字符串 (“”) 指示那些没有架构的表。 SchemaName 不能包含字符串搜索模式。

如果将 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 SchemaName 被视为标识符,其大小写并不重要。 如果它是SQL_FALSE, 则 SchemaName 是一个普通参数;它按字面处理,其大小写很重要。

NameLength2
[输入]长度(以 *SchemaName 的字符为单位)。

TableName
[输入]表名。 此参数不能为 null 指针。 SchemaName 不能包含字符串搜索模式。

如果 SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, 则 TableName 被视为标识符,其大小写不重要。 如果SQL_FALSE, 则 TableName 是一个普通参数;它按字面处理,其大小写很重要。

NameLength3
[输入]*TableName 的长度(以字符为单位)。

唯一
[输入]索引类型:SQL_INDEX_UNIQUE或SQL_INDEX_ALL。

Reserved
[输入]指示结果集中 CARDINALITY 和 PAGES 列的重要性。 以下选项仅影响 CARDINALITY 和 PAGES 列的返回;即使不返回 CARDINALITY 和 PAGES,也会返回索引信息。

SQL_ENSURE请求驱动程序无条件地检索统计信息。 仅符合开放组标准且不支持 ODBC 扩展 (驱动程序将无法支持 SQL_ENSURE.)

SQL_QUICK请求驱动程序检索 CARDINALITY 和 PAGES,前提是它们可从服务器随时可用。 在这种情况下,驱动程序不能保证是最新值。 写入开放组标准的 (应用程序将始终从符合 ODBC 3.x 的 drivers.SQL_QUICK行为)

返回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

诊断

SQLStatistics 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值,该 SQLGetDiagRecHandleType 为 SQL_HANDLE_STMT, 句柄StatementHandle。 下表列出了通常由 SQLStatistics 返回的 SQLSTATE 值,并说明了此函数上下文中的每个值;表示法“ (DM) ”位于驱动程序管理器返回的 SQLSTATEs 说明之前。 与每个 SQLSTATE 值关联的返回代码SQL_ERROR,除非另有说明。

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。 (函数返回 SQL_SUCCESS_WITH_INFO.)
08S01 通信链接失败 在函数完成处理之前,驱动程序与驱动程序连接到的数据源之间的通信链接失败。
24000 游标状态无效 在 StatementHandle 上打开了一个游标,并且已调用 SQLFetchSQLFetchScroll。 如果 SQLFetchSQLFetchScroll 未返回SQL_NO_DATA,则驱动程序管理器将返回此错误;如果 SQLFetchSQLFetchScroll 已返回SQL_NO_DATA,则驱动程序会返回此错误。

在 StatementHandle 上打开了游标,但尚未调用 SQLFetchSQLFetchScroll
40001 序列化失败 由于与另一个事务发生资源死锁,事务已回滚。
40003 语句完成未知 关联的连接在执行此函数期间失败,并且无法确定事务的状态。
HY000 常规错误 发生错误,其中没有特定的 SQLSTATE,并且没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述了错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY008 操作已取消 已为 StatementHandle 启用异步处理。 调用了函数,在它完成执行之前,在 StatementHandle 上调用了 SQLCancel 或 SQLCancelHandle,然后在 StatementHandle 上再次调用该函数。

函数已调用,在它完成执行之前, SQLCancelSQLCancelHandle 是从多线程应用程序中的不同线程在 StatementHandle 上调用的。
HY009 null 指针的使用无效 TableName 参数为空指针。

SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, CatalogName 参数为空指针,SQL_CATALOG_NAME InfoType 返回支持的目录名称。

(DM) SQL_ATTR_METADATA_ID 语句属性设置为 SQL_TRUE, SchemaName 参数为空指针。
HY010 函数序列错误 (DM) 为 与 StatementHandle 关联的连接句柄调用了异步执行的函数。 调用 SQLStatistics 函数时,此异步函数仍在执行。

(DM) SQLExecuteSQLExecDirectSQLMoreResults 已为 StatementHandle 调用并返回SQL_PARAM_DATA_AVAILABLE。 此函数是在检索所有流式处理参数的数据之前调用的。

(DM) 为 StatementHandle 调用了异步执行的函数 (不是此函数) ,并且调用此函数时仍在执行。

(DM) SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos 已为 StatementHandle 调用并返回SQL_NEED_DATA。 在为所有数据执行时参数或列发送数据之前调用了此函数。
HY013 内存管理错误 无法处理函数调用,因为无法访问基础内存对象,可能是由于内存不足。
HY090 无效的字符串或缓冲区长度 (DM) 其中一个名称长度参数的值小于 0,但不等于SQL_NTS。

其中一个名称长度参数的值超过了相应名称的最大长度值。
HY100 唯一性选项类型范围外 (DM) 指定了无效 的唯 一值。
HY101 准确度选项类型范围外 (DM) 指定了无效的 保留 值。
HY117 由于事务状态未知,连接已暂停。 仅允许断开连接和只读函数。 (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数
HYC00 未实现可选功能 指定了目录,驱动程序或数据源不支持目录。

指定了架构,驱动程序或数据源不支持架构。

驱动程序或数据源不支持SQL_ATTR_CONCURRENCY和 SQL_ATTR_CURSOR_TYPE 语句属性的当前设置组合。

SQL_ATTR_USE_BOOKMARKS 语句属性设置为 SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE 语句属性设置为驱动程序不支持书签的游标类型。
HYT00 超时时间已到 查询超时期限在数据源返回请求的结果集之前过期。 超时期限是通过 SQLSetStmtAttr SQL_ATTR_QUERY_TIMEOUT设置的。
HYT01 超过连接超时时间 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT设置。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 关联的驱动程序不支持 函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,将禁用轮询。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上的上一个异步操作。 如果对句柄的上一个函数调用返回SQL_STILL_EXECUTING并且启用了通知模式,则必须在句柄上调用 SQLCompleteAsync 以执行后期处理并完成操作。

注释

SQLStatistics 以标准结果集的形式返回有关单个表的信息,按NON_UNIQUE、TYPE、INDEX_QUALIFIER、INDEX_NAME和ORDINAL_POSITION排序。 结果集将表结果集) 的 CARDINALITY 和 PAGES 列中的统计信息 (与每个索引的相关信息合并在一起。 有关如何使用此信息的信息,请参阅 目录数据的使用

若要确定TABLE_CAT、TABLE_SCHEM、TABLE_NAME和COLUMN_NAME列的实际长度,应用程序可以使用SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN、SQL_MAX_TABLE_NAME_LEN和SQL_MAX_COLUMN_NAME_LEN选项调用 SQLGetInfo

注意

有关 ODBC 目录函数的常规用法、参数和返回数据的详细信息,请参阅 目录函数

以下列已重命名为 ODBC 3.x。 列名更改不会影响向后兼容性,因为应用程序按列号绑定。

ODBC 2.0 列 ODBC 3.x
TABLE_QUALIFIER TABLE_CAT
TABLE_OWNER TABLE_SCHEM
SEQ_IN_INDEX ORDINAL_POSITION
COLLATION ASC_OR_DESC

下表列出了结果集中的列。 第 13 列以外的其他列 (FILTER_CONDITION) 可由驱动程序定义。 应用程序应通过从结果集末尾倒计时(而不是指定显式序号位置)来访问特定于驱动程序的列。 有关详细信息,请参阅 目录函数返回的数据

列名称 列号 数据类型 注释
TABLE_CAT (ODBC 1.0) 1 Varchar 统计信息或索引所应用到的表的目录名称;如果不适用于数据源,则为 NULL。 如果驱动程序支持某些表的目录,但不支持其他表的目录,例如当驱动程序从不同的 DBMS 检索数据时,它将为没有目录的表返回空字符串 (“”) 。
TABLE_SCHEM (ODBC 1.0) 2 Varchar 统计信息或索引所应用到的表的架构名称;如果不适用于数据源,则为 NULL。 如果驱动程序支持某些表的架构,但不支持其他表的架构,例如当驱动程序从不同的 DBMS 检索数据时,它会为没有架构的表返回空字符串 (“”) 。
TABLE_NAME (ODBC 1.0) 3 Varchar 非 NULL 统计信息或索引所应用到的表的表名。
NON_UNIQUE (ODBC 1.0) 4 Smallint 指示索引是否不允许重复值:

SQL_TRUE索引值是否可以为非唯一值。

SQL_FALSE索引值是否必须唯一。

如果SQL_TABLE_STAT TYPE,则返回 NULL。
INDEX_QUALIFIER (ODBC 1.0) 5 Varchar 用于限定执行 DROP INDEX 的索引名称的标识符;如果数据源不支持索引限定符,或者如果 TYPE SQL_TABLE_STAT,则返回 NULL。 如果此列中返回非 null 值,则必须使用该值来限定 DROP INDEX 语句上的索引名称;否则,应使用TABLE_SCHEM来限定索引名称。
INDEX_NAME (ODBC 1.0) 6 Varchar 索引名称;如果SQL_TABLE_STAT TYPE,则返回 NULL。
类型 (ODBC 1.0) 7 Smallint(非 NULL) 返回的信息类型:

SQL_TABLE_STAT指示 CARDINALITY 或 PAGES 列) 中表 (的统计信息。

SQL_INDEX_BTREE指示 B 树索引。

SQL_INDEX_CLUSTERED指示聚集索引。

SQL_INDEX_CONTENT指示内容索引。

SQL_INDEX_HASHED指示哈希索引。

SQL_INDEX_OTHER指示另一种类型的索引。
ORDINAL_POSITION (ODBC 1.0) 8 Smallint 索引 (中的列序列号,从 1 个) 开始;如果SQL_TABLE_STAT TYPE,则返回 NULL。
COLUMN_NAME (ODBC 1.0) 9 Varchar 列名称。 如果列基于表达式(如 SALARY + BENEFITS),则返回表达式;如果无法确定表达式,则返回空字符串。 如果SQL_TABLE_STAT TYPE,则返回 NULL。
ASC_OR_DESC (ODBC 1.0) 10 Char(1) 列的排序顺序:“A”表示升序;“D”表示降序;如果数据源不支持列排序序列或SQL_TABLE_STAT TYPE,则返回 NULL。
CARDINALITY (ODBC 1.0) 11 Integer 表或索引的基数;如果 TYPE 为SQL_TABLE_STAT,则表中的行数;如果 TYPE 未SQL_TABLE_STAT,则索引中的唯一值数;如果值在数据源中不可用,则返回 NULL。
PAGES (ODBC 1.0) 12 Integer 用于存储索引或表的页数;如果 TYPE 为SQL_TABLE_STAT,则为表的页数;如果未SQL_TABLE_STAT TYPE,则为索引的页数;如果值在数据源中不可用,或者不适用于数据源,则返回 NULL。
FILTER_CONDITION (ODBC 2.0) 13 Varchar 如果索引是筛选索引,则这是筛选条件,例如 SALARY > 30000;如果无法确定筛选条件,则为空字符串。

如果索引不是筛选索引,则无法确定索引是筛选索引,还是SQL_TABLE_STAT TYPE。

如果结果集中的行对应于表,驱动程序会将 TYPE 设置为 SQL_TABLE_STAT,并将 NON_UNIQUE、INDEX_QUALIFIER、INDEX_NAME、ORDINAL_POSITION、COLUMN_NAME 和 ASC_OR_DESC 设置为 NULL。 如果 CARDINALITY 或 PAGES 在数据源中不可用,驱动程序会将其设置为 NULL。

代码示例

有关类似函数的代码示例,请参阅 SQLColumns

有关以下方面的信息 请参阅
将缓冲区绑定到结果集中的列 SQLBindCol 函数
取消语句处理 SQLCancel 函数
以仅向前方向提取单行或数据块。 SQLFetch 函数
提取数据块或滚动浏览结果集 SQLFetchScroll Function(SQLFetchScroll 函数)
返回外键的列 SQLForeignKeys 函数
返回主键的列 SQLPrimaryKeys 函数

另请参阅

ODBC API 参考
ODBC 头文件