与 SQL Server 早期版本的增强日期/时间类型行为 (ODBC)
本主题说明当使用增强的日期和时间功能的客户端应用程序与早于 SQL Server 2008 的 SQL Server 版本通信时的预期行为,以及使用 Microsoft 数据访问组件、Windows 数据访问组件或早于 SQL Server 2008 的 SQL Server Native Client 版本的客户端应用程序向支持增强的日期和时间功能的服务器发送命令时的预期行为。
下级客户端行为
使用早于 SQL Server 2008 的 SQL Server Native Client 版本编译的客户端应用程序将新的日期/时间类型看作 nvarchar 列。这些列内容用文字表示,如ODBC 日期/时间数据类型支持改进的“数据格式:字符串和文字”一节中所述。列大小是为列指定的秒小数精度的最大文字长度。
目录 API 将返回与返回给客户端的下级数据类型代码(例如 nvarchar)和相关的下级表示法(例如相应的文字格式)一致的元数据。不过,返回的数据类型名称将为 real SQL Server 2008 类型名称。
SQLDescribeCol、SQLDescribeParam、SQGetDescField 和 SQLColAttribute 返回的语句元数据将返回在各方面均与下级类型一致的元数据,包括类型名称。此类下级类型的一个示例是 nvarchar。
针对已进行日期/时间类型的架构更改的 SQL Server 2008 服务器运行下级客户端应用程序时,预期行为如下所示:
SQL Server 2005 类型 |
SQL Server 2008 类型 |
ODBC 客户端类型 |
结果转换(SQL 到 C) |
参数转换(C 到 SQL) |
---|---|---|---|---|
Datetime |
Date |
SQL_C_TYPE_DATE |
成功 |
成功 (1) |
SQL_C_TYPE_TIMESTAMP |
时间字段设置为零。 |
成功 (2) 如果时间字段非零,则失败。与 SQL Server 2005 一起使用。 |
||
Time(0) |
SQL_C_TYPE_TIME |
成功 |
成功 (1) |
|
SQL_C_TYPE_TIMESTAMP |
日期字段设置为当前日期。 |
成功 (2) 忽略日期。如果秒的小数部分非零,则失败。与 SQL Server 2005 一起使用。 |
||
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 |
Date |
SQL_C_TYPE_DATE |
成功 |
成功 |
SQL_C_TYPE_TIMESTAMP |
时间字段设置为零。 |
成功 (2) 如果时间字段非零,则失败。与 SQL Server 2005 一起使用。 |
||
Time(0) |
SQL_C_TYPE_TIME |
成功 |
成功 |
|
SQL_C_TYPE_TIMESTAMP |
日期字段设置为当前日期。 |
成功 (2) 忽略日期。如果秒的小数部分非零,则失败。 与 SQL Server 2005 一起使用。 |
||
Datetime2(0) |
SQL_C_TYPE_TIMESTAMP |
成功 |
成功 |
符号含义
符号 |
含义 |
---|---|
1 |
如果已与 SQL Server 2005 一起使用,应继续与 SQL Server 2008 一起使用。 |
2 |
已与 SQL Server 2005 一起使用的应用程序在与 SQL Server 2008 一起使用时,可能失败。 |
请注意只考虑了常见的架构更改。以下是常见的更改:
使用新类型,这种情况下在逻辑上应用程序只需要一个日期或时间值。但是,由于缺乏单独的日期和时间类型,会强制应用程序使用 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 的服务器实例时,只要试图使用新的服务器类型或相关的元数据代码和描述符字段,都将导致返回 SQL_ERROR。将生成以下诊断记录:具有 SQLSTATE HY004 和消息“SQL 数据类型对于连接的服务器版本无效”,或具有 07006 和消息“受限制的数据类型属性冲突”。