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 可以返回 SQLExecute 或 SQLExecDirect 可能返回的所有错误代码。
此外,在以下情况下,该驱动程序不支持调用 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)。