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

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

格式化文件

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

文件存储类型

宿主文件数据类型

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

Datetime

SQLDATETIME

d

Smalldatetime

SQLDATETIM4

D

日期

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

日期

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

日期

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

DBTIME2

8

10,16

DBTIMESTAMP

19

21..27

DBTIMESTAMPOFFSET

26

28..34

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

类型

暗指的小数位数

0

暗指的小数位数

1..9

DBTIME2

8

1..9

DBTIMESTAMP

19

21..29

DBTIMESTAMPOFFSET

26

28..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 和更早版本的行为将保持。

请参阅

概念

日期/时间的改进 (ODBC)

日期/时间改进 (OLE DB)