与 SQL Server 早期版本的增强日期和时间类型行为 (ODBC)
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
本主题介绍使用增强日期和时间功能的客户端应用程序与早于 SQL Server 2008 (10.0.x) 的 SQL Server 版本通信,以及使用 Microsoft 数据访问组件、Windows 数据访问组件或早于 SQL Server Native Client 版本的客户端应用程序通信时的预期行为SQL Server 2008 (10.0.x) 向支持增强日期和时间功能的服务器发送命令。
下级客户端行为
使用 SQL Server 2008 (10.0.x 之前的 SQL Server Native Client 版本编译的客户端应用程序) 将新的日期/时间类型视为 nvarchar 列。 列内容是文本表示形式,如 ODBC 日期和时间改进的数据类型支持中的“数据格式:字符串和文本”部分所述。 列大小是为列指定的秒小数精度的最大文字长度。
目录 API 将返回与返回给客户端的下级数据类型代码(例如 nvarchar)和相关的下级表示法(例如相应的文字格式)一致的元数据。 但是,返回的数据类型名称将是实际SQL Server 2008 (10.0.x) 类型名称。
SQLDescribeCol、SQLDescribeParam、SQGetDescField 和 SQLColAttribute 返回的语句元数据将返回与下层类型在所有方面(包括类型名称)一致的元数据。 此类下层类型的一个示例是 nvarchar。
当下层客户端应用程序针对SQL Server 2008 (10.0.x) (或更高版本) 服务器运行,其架构已对日期/时间类型进行了更改,预期行为如下所示:
SQL Server 2005 类型 | SQL Server 2008 (10.0.x) (或更高版本) 类型 | ODBC 客户端类型 | 结果转换(SQL 到 C) | 参数转换(C 到 SQL) |
---|---|---|---|---|
datetime | 日期 | SQL_C_TYPE_DATE | 确定 | 确定 (1) |
SQL_C_TYPE_TIMESTAMP | 时间字段设置为零。 | 成功 (2) 如果时间字段非零,则失败。 适用于 SQL Server 2005 (9.x) 。 |
||
Time(0) | SQL_C_TYPE_TIME | 确定 | 确定 (1) | |
SQL_C_TYPE_TIMESTAMP | 日期字段设置为当前日期。 | 成功 (2) 忽略日期。 如果秒的小数部分不为零,则失败。 适用于 SQL Server 2005 (9.x) 。 |
||
Time(7) | SQL_C_TIME | 失败 - 时间文本无效。 | 确定 (1) | |
SQL_C_TYPE_TIMESTAMP | 失败 - 时间文本无效。 | 确定 (1) | ||
Datetime2 (3) | SQL_C_TYPE_TIMESTAMP | 确定 | 确定 (1) | |
Datetime2 (7) | SQL_C_TYPE_TIMESTAMP | 确定 | 由客户端转换将值舍入到 1/300 秒。 | |
Smalldatetime | 日期 | SQL_C_TYPE_DATE | 确定 | 确定 |
SQL_C_TYPE_TIMESTAMP | 时间字段设置为零。 | 成功 (2) 如果时间字段非零,则失败。 适用于 SQL Server 2005 (9.x) 。 |
||
Time(0) | SQL_C_TYPE_TIME | 确定 | 确定 | |
SQL_C_TYPE_TIMESTAMP | 日期字段设置为当前日期。 | 成功 (2) 忽略日期。 如果秒的小数部分非零,则失败。 适用于 SQL Server 2005 (9.x) 。 |
||
Datetime2(0) | SQL_C_TYPE_TIMESTAMP | 确定 | 确定 |
符号含义
符号 | 含义 |
---|---|
1 | 如果它适用于 SQL Server 2005 (9.x) 它应继续使用较新版本的 SQL Server。 |
2 | 使用 SQL Server 2005 (9.x) 的应用程序可能会因较新版本的 SQL Server 而失败。 |
请注意只考虑了常见的架构更改。 以下是常见的更改:
使用新类型,这种情况下在逻辑上应用程序只需要一个日期或时间值。 但是,由于缺乏单独的日期和时间类型,会强制应用程序使用 datetime 或 smalldatetime。
使用新类型以获得其他秒小数精度或准确性。
转换到 datetime2,因为这是首选的日期和时间数据类型。
SQLColumns、SQLProcedureColumns 和 SQLSpecialColumns 返回的列元数据
对于日期/时间类型将返回以下列值:
列类型 | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
---|---|---|---|---|---|---|
DATA_TYPE | SQL_WVARCHAR | SQL_WVARCHAR | SQL_TYPE_TIMESTAMP | SQL_TYPE_TIMESTAMP | SQL_WVARCHAR | SQL_WVARCHAR |
TYPE_NAME | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
COLUMN_SIZE | 10 | 8,10..16 | 16 | 23 | 19、21..27 | 26、28..34 |
BUFFER_LENGTH | 20 | 16, 20..32 | 16 | 16 | 38, 42..54 | 52, 56..68 |
DECIMAL_DIGITS | Null | Null | 0 | 3 | Null | Null |
SQL_DATA_TYPE | SQL_WVARCHAR | SQL_WVARCHAR | SQL_DATETIME | SQL_DATETIME | SQL_WVARCHAR | SQL_WVARCHAR |
SQL_DATETIME_SUB | Null | Null | SQL_CODE_TIMESTAMP | SQL_CODE_TIMESTAMP | Null | Null |
CHAR_OCTET_LENGTH | Null | Null | Null | Null | Null | Null |
SS_DATA_TYPE | 0 | 0 | 111 | 111 | 0 | 0 |
SQLSpecialColumns 不返回 SQL_DATA_TYPE、SQL_DATETIME_SUB、CHAR_OCTET_LENGTH 或 SS_DATA_TYPE。
SQLGetTypeInfo 返回的数据类型元数据
对于日期/时间类型将返回以下列值:
列类型 | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
DATA_TYPE | SQL_WVARCHAR | SQL_WVARCHAR | SQL_TYPE_TIMESTAMP | SQL_TYPE_TIMESTAMP | SQL_WVARCHAR | SQL_WVARCHAR |
COLUMN_SIZE | 10 | 16 | 16 | 23 | 27 | 34 |
LITERAL_PREFIX | ' | ' | ' | ' | ' | ' |
LITERAL_SUFFIX | ' | ' | ' | ' | ' | ' |
CREATE_PARAMS | Null | Null | Null | Null | Null | Null |
NULLABLE | SQL_NULLABLE | SQL_NULLABLE | SQL_NULLABLE | SQL_NULLABLE | SQL_NULLABLE | SQL_NULLABLE |
CASE_SENSITIVE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE | SQL_PRED_SEARCHABLE |
UNSIGNED_ATTRIBUTE | Null | Null | Null | Null | Null | Null |
FXED_PREC_SCALE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE | SQL_FALSE |
AUTO_UNIQUE_VALUE | Null | Null | Null | Null | Null | Null |
LOCAL_TYPE_NAME | date | time | smalldatetime | datetime | datetime2 | datetimeoffset |
MINIMUM_SCALE | Null | Null | 0 | 3 | Null | Null |
MAXIMUM_SCALE | Null | Null | 0 | 3 | Null | Null |
SQL_DATA_TYPE | SQL_WVARCHAR | SQL_WVARCHAR | SQL_DATETIME | SQL_DATETIME | SQL_WVARCHAR | SQL_WVARCHAR |
SQL_DATETIME_SUB | Null | Null | SQL_CODE_TIMESTAMP | SQL_CODE_TIMESTAMP | Null | Null |
NUM_PREC_RADIX | Null | Null | Null | Null | Null | Null |
INTERVAL_PRECISION | Null | Null | Null | Null | Null | Null |
USERTYPE | 0 | 0 | 12 | 22 | 0 | 0 |
下级服务器行为
连接到SQL Server 2008 (10.0.x) 的早期版本的服务器实例时,任何尝试使用新服务器类型或关联的元数据代码和描述符字段将导致返回SQL_ERROR。 将生成以下诊断记录:具有 SQLSTATE HY004 和消息“SQL 数据类型对于连接的服务器版本无效”,或具有 07006 和消息“受限制的数据类型属性冲突”。
另请参阅
反馈
提交和查看相关反馈