SQLDescribeParam

为了描述任何 SQL 语句的参数,SQL Server Native Client ODBC 驱动程序在准备好的 ODBC 语句句柄上调用 SQLDescribeParam 时生成和执行 Transact-SQL SELECT 语句。 结果集的元数据确定预定义语句中的参数的特征。 SQLDescribeParam 可以返回 SQLExecute 或 SQLExecDirect 可能返回的任何错误代码。

从 SQL Server 2012 开始,数据库引擎的改进使 SQLDescribeParam 能够更准确地描述预期结果。 这些更准确的结果可能与以前版本的 SQL Server 中 SQLDescribeParam 返回的值不同。 有关详细信息,请参阅元数据发现

ParameterSizePtr 也是 2012 SQL Server 中的新增功能,现在返回一个值,该值与 ODBC 规范中定义的相应参数标记的列或表达式的大小(以字符为单位)的定义保持一致。 在早期版本的SQL Server Native Client中,ParameterSizePtr 可以是类型的对应值SQL_DESC_OCTET_LENGTH,也可以是提供给某个类型的 SQLBindParameter 的不相关的列大小值,应 (SQL_INTEGER忽略其值,例如,) 。

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

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

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

  • 对于任何 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);  

在成功准备后执行 SQLDescribeParam 时,如果连接到除 的任何数据库, master则返回空行集。 如下所述,相同的调用会导致 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
日期 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 User-Defined类型 (ODBC)

另请参阅

SQLDescribeParam 函数
ODBC API 实现细节