sql_variant 对日期/时间类型的支持
本主题描述 sql_variant 数据类型如何支持增强的日期和时间功能。
列属性 SQL_CA_SS_VARIANT_TYPE 用于返回变体结果列的 C 类型。SQL Server 2008 引入了新增的属性 SQL_CA_SS_VARIANT_SQL_TYPE,该属性在实现行描述符 (IRD) 中设置变体结果列的 SQL 类型。还可以在实现参数描述符 (IPD) 中使用 SQL_CA_SS_VARIANT_SQL_TYPE,以指定将 SQL_C_BINARY C 类型与 SQL_SS_VARIANT 类型绑定的 SQL_SS_TIME2 或 SQL_SS_TIMESTAMPOFFSET 参数的 SQL 类型。
新类型 SQL_SS_TIME2 和 SQL_SS_TIMESTAMPOFFSET 可以由 SQLColAttribute 设置。SQL_CA_SS_VARIANT_SQL_TYPE 可以由 SQLGetDescField 返回。
对于结果列,驱动程序将从变体转换到日期/时间类型。有关详细信息,请参阅由 SQL 转换为 C。绑定到 SQL_C_BINARY 时,缓冲区长度必须足够大,从而能够接收对应于 SQL 类型的结构。
对于 SQL_SS_TIME2 和 SQL_SS_TIMESTAMPOFFSET 参数,驱动程序会将 C 值转换为 sql_variant 值,下表对此进行了描述。如果参数被绑定为 SQL_C_BINARY 并且服务器类型是 SQL_SS_VARIANT,那么,除非应用程序已将 SQL_CA_SS_VARIANT_SQL_TYPE 设置为其他某个 SQL 类型,否则该参数将被视为二进制值。这种情况下,SQL_CA_SS_VARIANT_SQL_TYPE 优先;就是说,如果设置 SQL_CA_SS_VARIANT_SQL_TYPE,它将覆盖从 C 类型推导出变体 SQL 类型的默认行为。
C 类型 |
服务器类型 |
注释 |
---|---|---|
SQL_C_CHAR |
varchar |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_WCHAR |
nvarcar |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_TINYINT |
smallint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_STINYINT |
smallint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_SHORT |
smallint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_SSHORT |
smallint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_USHORT |
int |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_LONG |
int |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_SLONG |
int |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_ULONG |
bigint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_SBIGINT |
bigint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_FLOAT |
real |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_DOUBLE |
float |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_BIT |
bit |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_UTINYINT |
tinyint |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_BINARY |
varbinary |
SQL_CA_SS_VARIANT_SQL_TYPE 未设置。 |
SQL_C_BINARY |
time |
SQL_CA_SS_VARIANT_SQL_TYPE = SQL_SS_TIME2 小数位数将设置为 SQL_DESC_PRECISION(SQLBindParameter 的 DecimalDigits 参数)。 |
SQL_C_BINARY |
datetimeoffset |
SQL_CA_SS_VARIANT_SQL_TYPE = SQL_SS_TIMESTAMPOFFSET 小数位数将设置为 SQL_DESC_PRECISION(SQLBindParameter 的 DecimalDigits 参数)。 |
SQL_C_TYPE_DATE |
date |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_TYPE_TIME |
time(0) |
忽略 SQL_CA_SS_VARIANT_SQL_TYPE。 |
SQL_C_TYPE_TIMESTAMP |
datetime2 |
小数位数将设置为 SQL_DESC_PRECISION(SQLBindParameter 的 DecimalDigits 参数)。 |
SQL_C_NUMERIC |
decimal |
精度设置为 SQL_DESC_PRECISION(SQLBindParameter 的 ColumnSize 参数)。 小数位数设置为 SQL_DESC_SCALE(SQLBindParameter 的 DecimalDigits 参数)。 |