与 SQL Server 早期版本的增强日期和时间类型行为 (ODBC)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics 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 和消息“受限制的数据类型属性冲突”。

另请参阅

日期和时间改进 (ODBC)