表值参数的 ODBC SQL 类型
对表值参数的支持是通过新的 ODBC SQL 类型 SQL_SS_TABLE 提供的。
注释
不能将 SQL_SS_TABLE 转换为任何其他 ODBC 或 SQL Server 数据类型。
如果 SQL_SS_TABLE 在 SQLBindParameter 的 ValueType 参数中用作 C 数据类型,或者尝试将应用程序参数描述符 (APD) 记录中的 SQL_DESC_TYPE 设置为 SQL_SS_TABLE,则会返回 SQL_ERROR,并生成带有 SQLSTATE=HY003 的诊断记录“应用程序缓冲区类型无效”。
如果在 IPD 记录中将 SQL_DESC_TYPE 设置为 SQL_SS_TABLE,并且对应的应用程序参数描述符记录不为 SQL_C_DEFAULT,则会返回 SQL_ERROR,并生成带有 SQLSTATE=HY003 的诊断记录“应用程序缓冲区类型无效”。 SQLSetDescField、SQLSetDescRec 或 SQLBindParameter 的 ParameterType 可能会出现这种情况。
调用 SQLGetData 时,如果 TargetType 参数为 SQL_SS_TABLE,则会返回 SQL_ERROR,并生成带有 SQLSTATE=HY003 的诊断记录“应用程序缓冲区类型无效”。
不能将表值参数列作为 SQL_SS_TABLE 类型绑定。 如果在调用 SQLBindParameter 时将 ParameterType 设置为 SQL_SS_TABLE,则返回 SQL_ERROR,并生成带有 SQLSTATE=HY004 的诊断记录“SQL 数据类型无效”。 SQLSetDescField 和 SQLSetDescRec 也可能会出现这种情况。
表值参数列值与参数和结果列具有相同的数据转换选项。
在 SQL Server 2008 或更高版本中只能将表值参数用作输入参数。 如果尝试通过 SQLBindParameter 或 SQLSetDescField 将 SQL_DESC_PARAMETER_TYPE 设置为 SQL_PARAM_INPUT 以外的值,则返回 SQL_ERROR,并且将向该语句添加带有 SQLSTATE=HY105 的诊断记录和消息“参数类型无效”。
表值参数列不能在 StrLen_or_IndPtr 中使用 SQL_DEFAULT_PARAM,因为表值参数不支持按行默认值。 应用程序可以改为将 SQL_CA_SS_COL_HAS_DEFAULT_VALUE 列属性设置为 1。 这表示该列的所有行均具有默认值。 如果 StrLen_or_IndPtr 设置为 SQL_DEFAULT_PARAM,SQLExecute 或 SQLExecDirect 将返回 SQL_ERROR,并且将向该语句添加带有 SQLSTATE=HY090 的诊断记录和消息“字符串或缓冲区长度无效”。