为了描述任何 SQL 语句的参数,SQL Server Native Client ODBC 驱动程序在准备好的 ODBC 语句句柄上调用 SQLDescribeParam 时生成和执行 Transact-SQL SELECT 语句。 结果集的元数据确定已准备语句中参数的特征。 SQLDescribeParam 可以返回 SQLExecute 或 SQLExecDirect 可能返回的任何错误代码。
从 SQL Server 2012 开始的数据库引擎改进使 SQLDescribeParam 能够获取预期结果的更准确说明。 这些更准确的结果可能与 SQL Server 早期版本中 SQLDescribeParam 返回的值不同。 有关详细信息,请参阅 元数据发现。
在 SQL Server 2012 中, ParameterSizePtr 现在还返回一个值,该值与 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 和 Table-Valued 参数
应用程序可以使用 SQLDescribeParam 检索已准备语句的表值参数信息。 有关详细信息,请参阅 Table-Valued 已准备语句的参数元数据。
有关表值参数的详细信息,请参阅 Table-Valued 参数(ODBC)。
SQLDescribeParam 对增强的日期和时间功能的支持
日期/时间类型返回以下值:
| DataTypePtr | ParameterSizePtr | DecimalDigitsPtr | |
|---|---|---|---|
| datetime | SQL_TYPE_TIMESTAMP | 23 | 3 |
| smalldatetime | SQL_TYPE_TIMESTAMP | 16 | 0 |
| 日期 | SQL类型日期 | 10 | 0 |
| 时间 | SQL_SS_TIME2 | 8, 10..16 | 0..7 |
| datetime2 | SQL_TYPE_TIMESTAMP | 19、21..27 | 0..7 |
| 日期时间偏移量 | SQL_SS_TIMESTAMPOFFSET | 26、28..34 | 0..7 |
有关详细信息,请参阅日期和时间改进(ODBC)。
SQLDescribeParam 对大型 CLR UDT 的支持
SQLDescribeParam 支持大型 CLR 用户定义的类型(UDT)。 有关详细信息,请参阅大型 CLR 用户定义的类型(ODBC)。