SQLDescribeParam
为描述所有 SQL 语句的参数,当针对已准备的 ODBC 语句句柄调用 SQLDescribeParam 时,SQL Server Native Client ODBC 驱动程序将生成并执行 Transact-SQL SELECT 语句。 结果集的元数据确定预定义语句中的参数的特征。SQLDescribeParam 可以返回 SQLExecute 或 SQLExecDirect 可能返回的任何错误代码。
从 SQL Server 2012 开始,数据库引擎中的改进功能允许 SQLDescribeParam 获取关于预期结果的更准确描述。 这些更准确的结果可能与 SQL Server 以前版本中的 SQLDescribeParam 所返回的值有所不同。 有关详细信息,请参阅元数据发现。
ParameterSizePtr 现在返回的值与 ODBC specification(ODBC 规范)中所定义的相应参数标记的列或表达式的大小(用字符数表示)定义一致,这也是 SQL Server 2012 中的新功能。 在以前版本的 SQL Server Native Client 中,ParameterSizePtr 可以是用于类型的 SQL_DESC_OCTET_LENGTH 的相应值,或提供给用于类型的 SQLBindParameter 的不相关列大小值,该类型的值应忽略(例如 SQL_INTEGER)。
在以下情况下,该驱动程序不支持调用 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)。