增强的日期/时间类型的大容量复制更改(OLE DB 和 ODBC)

本主题描述为支持大容量复制功能的日期/时间增强功能。本主题中的信息对于 SQL Server Native Client 中的 OLE DB 和 ODBC 均适用。

格式化文件

在以交互方式生成格式化文件时,下表描述用于指定日期/时间类型和相应的宿主文件数据类型名称的输入。

文件存储类型

宿主文件数据类型

响应提示:“请输入 <field_name> [<default>] 字段的文件存储类型:”

Datetime

SQLDATETIME

d

Smalldatetime

SQLDATETIM4

D

Date

SQLDATE

de

Time

SQLTIME

te

Datetime2

SQLDATETIME2

d2

Datetimeoffset

SQLDATETIMEOFFSET

do

XML 格式化文件 XSD 将增加以下内容:

    <xs:complexType name="SQLDATETIME2">
        <xs:complexContent>
            <xs:extension base="bl:Fixed"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="SQLDATETIMEOFFSET">
        <xs:complexContent>
            <xs:extension base="bl:Fixed"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="SQLDATE">
        <xs:complexContent>
            <xs:extension base="bl:Fixed"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="SQLTIME">
        <xs:complexContent>
            <xs:extension base="bl:Fixed"/>
        </xs:complexContent>
    </xs:complexType>

字符数据文件

在字符数据文件中,日期和时间值按ODBC 日期/时间数据类型支持改进(针对 ODBC)或针对 OLE DB 日期/时间改进的数据类型支持(针对 OLE DB)的“数据格式:字符串和文字”一节中所描述的内容表示。

在本机数据文件中,四个新类型的日期和时间值表示为其 TDS 表示形式且小数位数为 7 位(因为这是 SQL Server 支持的最大小数位数并且 bcp 数据文件不存储这些列的小数位数)。对于现有 datetime 和 smalldatetime 类型或其表格数据流 (TDS) 表示形式的存储没有变化。

针对 OLE DB 的不同存储类型的存储大小如下:

文件存储类型

存储大小(以字节为单位)

datetime

8

smalldatetime

4

date

3

time

6

datetime2

9

datetimeoffset

11

针对 ODBC 的大小如下。请注意,不必在格式化文件或数据文件中存储精度,因为 BCP.exe 将始终从服务器检索精度。

文件存储类型

存储大小(以字节为单位)

存储格式

datetime (d)

8

TDS

smalldatetime (D)

4

TDS

date (de)

3

TDS

time (te)

6

TDS

datetime2 (d2)

9

TDS

datetimeoffset (do)

11

TDS

sqlncli.h 中的 BCP 类型

以下类型在 sqlncli.h 中定义,以便用于对 ODBC 的 BCP API 扩展。这些类型跟随 OLE DB 中的 IBCPSession::BCPColFmt 的 eUserDataType 参数传递。

文件存储类型

宿主文件数据类型

sqlncli.h 中用于 IBCPSession::BCPColFmt 的类型

Datetime

SQLDATETIME

BCP_TYPE_SQLDATETIME

0x3d

Smalldatetime

SQLDATETIM4

BCP_TYPE_SQLDATETIME4

0x3a

Date

SQLDATE

BCP_TYPE_SQLDATE

0x28

Time

SQLTIME

BCP_TYPE_SQLTIME

0x29

Datetime2

SQLDATETIME2

BCP_TYPE_SQLDATETIME2

0x2a

Datetimeoffset

SQLDATETIMEOFFSET

BCP_TYPE_SQLDATETIMEOFFSET

0x2b

BCP 数据类型转换

下表提供转换信息。

OLE DB 说明   以下转换由 IBCPSession 执行。IRowsetFastLoad 使用在在客户端和服务器之间执行的转换中定义的 OLE DB 转换。请注意,日期时间值将舍入为 1 秒的 1/300,smalldatetime 值在执行下述客户端转换后将秒设置为零。日期时间舍入将传播至小时和分钟,而非日期。

           到 -->

date

time

smalldatetime

datetime

datetime2

datetimeoffset

char

wchar

Date

1

-

1,6

1,6

1,6

1,5,6

1,3

1,3

Time

不适用

1,10

1,7,10

1,7,10

1,7,10

1,5,7,10

1,3

1,3

Smalldatetime

1,2

1,4,10

1

1

1,10

1,5,10

1,11

1,11

Datetime

1,2

1,4,10

1,12

1

1,10

1,5,10

1,11

1,11

Datetime2

1,2

1,4,10

1,10 (ODBC)1,12 (OLE DB)

1,10

1,10

1,5,10

1,3

1,3

Datetimeoffset

1,2,8

1,4,8,10

1,8,10

1,8,10

1,8,10

1,10

1,3

1,3

Char/wchar (date)

9

-

9,6 (ODBC)9,6,12 (OLE DB)

9,6 (ODBC)9,6,12 (OLE DB)

9,6

9,5,6

不适用

不适用

Char/wchar (time)

-

9,10

9,7,10 (ODBC)9,7,10,12 (OLE DB)

9,7,10 (ODBC)9,7,10, 12 (OLE DB)

9,7,10

9,5,7,10

不适用

不适用

Char/wchar (datetime)

9,2

9,4,10

9,10 (ODBC)9,10,12 (OLE DB)

9,10 (ODBC)9,10,12 (OLE DB)

9,10

9,5,10

不适用

不适用

Char/wchar (datetimeoffset)

9,2,8

9,4,8,10

9,8,10 (ODBC)9,8,10,12 (OLE DB)

9,8,10 (ODBC)9,8,10,12 (OLE DB)

9,8,10

9,10

不适用

不适用

符号含义

符号

含义

-

不支持任何转换。

生成 ODBC 诊断记录,同时还生成 SQLSTATE 07006 和消息“受限制的数据类型属性冲突”。

1

如果提供的数据无效,则生成 ODBC 诊断记录,同时还生成 SQLSTATE 22007 和消息“日期时间格式无效”。对于 datetimeoffset 值,在转换为 UTC 后时间部分必须处于规定范围内,即使不要求转换为 UTC。这是因为 TDS 和服务器始终规范化 UTC 的 datetimeoffset 值中的时间。因此,在转换为 UTC 后,客户端必须检查时间部分是否处于支持的范围内。

2

忽略时间部分。

3

对于 ODBC,如果发生具有数据丢失的截断,将生成一个诊断记录,同时还生成 SQLSTATE 22001 和消息“字符串数据,右端被截断”。秒的小数形式位数(小数位数)根据下表的目标列的大小确定。对于大于表中范围的列大小,则暗指小数位数为 7。此转换应允许最高 9 位的秒的小数形式位数,这是 ODBC 允许的最大位数。

类型暗指的小数位数 0暗指的小数位数 1..7
DBTIME2810,16
DBTIMESTAMP1921..27
DBTIMESTAMPOFFSET2628..34

对于 OLE DB,如果发生具有数据丢失的截断,则会发出错误。对于 datetime2,秒的小数形式位数(小数位数)根据下表的目标列的大小确定。对于大于表中范围的列大小,则暗指小数位数为 9。此转换应允许最高 9 位的秒的小数部分位数,这是 OLE DB 允许的最大位数。

类型暗指的小数位数 0暗指的小数位数 1..9
DBTIME281..9
DBTIMESTAMP1921..29
DBTIMESTAMPOFFSET2628..36

4

忽略日期部分。

5

时区设置为 UTC(例如 00:00)。

6

时间设置为零。

7

日期设置为 1900-01-01。

8

忽略时区偏移量。

9

根据遇到的第一个标点符号以及出现的剩余部分,该字符串将被分析和转换为 date、datetime、datetimeoffset 或 time 值。然后,根据本主题末尾的表中针对此过程发现的源类型的规则,此字符串将转换为目标类型。如果提供的数据不能在分析时无错,或者任何组成部分超出允许的范围,或者不存在从文字类型到目标类型的转换,则发出错误 (OLE DB),或者生成 ODBC 诊断记录,同时还生成 SQLSTATE 22018 和消息“为转换指定的字符值无效”。对于 datetime 和 smalldatetime 参数,如果年份处于这些类型支持的范围外,则发出错误 (OLE DB),或者生成 ODBC 诊断记录,同时还生成 SQLSATE 22007 和消息“日期时间格式无效”。

对于 datetimeoffset,在转换为 UTC 后该值必须处于规定范围内,即使不要求转换为 UTC。这是因为 TDS 和服务器始终规范化 UTC 的 datetimeoffset 值中的时间,因此在转换为 UTC 后,客户端必须确认时间部分处于支持的范围内。如果该值不在支持的 UTC 范围内,则发出错误 (OLE DB),或者生成 ODBC 诊断记录,同时还生成 SQLSTATE 22007 和消息“日期时间格式无效”。

10

如果在客户端到服务器转换时发生具有数据丢失的截断,则发出错误 (OLE DB),或者生成 ODBC 诊断记录,同时还生成 SQLSTATE 22008 和消息“日期时间字段溢出”。如果值处于服务器使用的 UTC 范围可表示的范围外,也会发生此错误。如果在服务器到客户端转换时发生秒或秒的小数部分截断,则只会显示警告。

11

如果发生具有数据丢失的截断,则生成诊断记录。

在服务器到客户端转换时,这是警告 (ODBC SQLSTATE S1000)。

在客户端到服务器转换时,这是错误 (ODBC SQLSTATE 22001)。

12

秒设置为零,秒的小数部分被放弃。可能没有截断错误。

不适用

现有 SQL Server 2005 和更早版本的行为将保持。