SQLDescribeParam

为描述所有 SQL 语句的参数,当针对已准备的 ODBC 语句句柄调用 SQLDescribeParam 时,SQL Server Native Client ODBC 驱动程序将生成并执行 Transact-SQL SELECT 语句。当执行查询时,该驱动程序使用 SET FMTONLY 语句。结果集的元数据确定预定义语句中的参数的特征。

请看下面的 ODBC SQL 语句:

INSERT INTO Shippers (ShipperID, CompanyName, Phone) VALUES (?, ?, ?)

调用 SQLDescribeParam 时,此 ODBC SQL 语句导致驱动程序执行以下 Transact-SQL 语句:

SET FMTONLY ON
SELECT ShipperID, CompanyName, Phone FROM Shippers
SET FMTONLY OFF

因此,SQLDescribeParam 可以返回 SQLExecuteSQLExecDirect 可能返回的所有错误代码。

此外,在以下情况下,该驱动程序不支持调用 SQLDescribeParam

  • 在针对包含 FROM 子句的任何 Transact-SQL UPDATE 或 DELETE 语句执行 SQLExecDirect 之后。

  • 对于 HAVING 子句中包含参数或与 SUM 函数的结果相比较的任何 ODBC 或 Transact-SQL 语句。

  • 对于依赖于包含参数的子查询的任何 ODBC 或 Transact-SQL 语句。

  • 对于在比较和类似表达式中包含参数标记或包含限定谓词的 ODBC SQL 语句。

  • 对于其参数之一为函数参数的任何查询。

  • 当 Transact-SQL 命令中有注释 (/* */) 时。

在对 Transact-SQL 语句进行批处理时,对于批处理中第一个语句后的语句中的参数标记,该驱动程序也不支持调用 SQLDescribeParam

当描述已准备的存储过程的参数时,SQLDescribeParam 使用系统存储过程 sp_sproc_columns 来检索参数特征。sp_sproc_columns 可以报告当前用户数据库中的存储过程的数据。准备完全限定的存储过程名称允许跨多个数据库执行 SQLDescribeParam。例如,可以在任何数据库中准备和执行系统存储过程 sp_who,如下所示:

SQLPrepare(hstmt, "{call sp_who(?)}", SQL_NTS);

当连接到除 master 以外的任何数据库时,在成功准备后执行 SQLDescribeParam 将返回一个空的行集。按如下方式准备的相同调用将导致 SQLDescribeParam 成功,而不管当前用户数据库如何:

SQLPrepare(hstmt, "{call master..sp_who(?)}", SQL_NTS);

对于大型值数据类型,在 DataTypePtr 中返回的值包括 SQL_VARCHAR、SQL_VARBINARY 或 SQL_NVARCHAR。为了指示大型值数据类型参数的大小为“无限制”,SQL Server Native Client ODBC 驱动程序将 ParameterSizePtr 设置为 0。将返回标准 varchar 参数的实际大小值。

注意注意

对于 SQL_VARCHAR、SQL_VARBINARY 或 SQL_WVARCHAR 参数,如果参数绑定有最大大小,则返回该参数的绑定大小,而非“无限制”。

若要绑定大小“无限制”的输入参数,必须使用执行时数据。不能绑定大小“无限制”的输出参数(无法对输出参数中的数据进行流式处理,就像 SQLGetData 无法对结果集进行流式处理一样)。

对于输出参数,必须绑定一个缓冲区,如果值过大,则填充此缓冲区,并返回 SQL_SUCCESS_WITH_INFO 消息和“字符串数据;右端被截断”的警告。随后将放弃截断的数据。

SQLDescribeParam 和表值函数

应用程序可以使用 SQLDescribeParam 检索预定义语句的表值参数信息。有关详细信息,请参阅准备的语句的表值参数元数据

有关一般表值参数的详细信息,请参阅表值参数 (ODBC)

SQLDescribeParam 对日期和时间增强功能的支持

日期/时间类型返回以下值:

DataTypePtr

ParameterSizePtr

DecimalDigitsPtr

datetime

SQL_TYPE_TIMESTAMP

23

3

smalldatetime

SQL_TYPE_TIMESTAMP

16

0

date

SQL_TYPE_DATE

10

0

time

SQL_SS_TIME2

8, 10..16

0..7

datetime2

SQL_TYPE_TIMESTAMP

19, 21..27

0..7

datetimeoffset

SQL_SS_TIMESTAMPOFFSET

26, 28..34

0..7

有关详细信息,请参阅 日期/时间的改进 (ODBC)

SQLDescribeParam 对大型 CLR UDT 的支持

SQLDescribeParam 支持大型 CLR 用户定义类型 (UDT)。有关详细信息,请参阅大型 CLR 用户定义类型 (ODBC)

请参阅

概念

其他资源