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

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

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

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件随附的 SQLNCLI (版本 2012 到 2019) ,请参阅此支持生命周期异常

格式化文件

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

文件存储类型 宿主文件数据类型 响应提示:“请输入字段 <field_name> 的文件存储类型 [<默认值>]:”
Datetime SQLDATETIME d
Smalldatetime SQLDATETIM4 D
Date SQLDATE de
时间 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
时间 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
时间 空值 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 如果提供的数据无效,则会使用 SQLSTATE 22007 和消息“日期时间格式无效”生成 ODBC 诊断记录。 对于 datetimeoffset 值,在转换为 UTC 后时间部分必须处于规定范围内,即使不要求转换为 UTC。 这是因为 TDS 和服务器始终规范化 UTC 的 datetimeoffset 值中的时间。 因此,在转换为 UTC 后,客户端必须检查时间部分是否处于支持的范围内。
2 忽略时间部分。
3 对于 ODBC,如果发生截断并丢失数据,则会使用 SQLSTATE 22001 生成诊断记录,并显示消息“字符串数据,右截断”小数秒位数 (刻度) 根据下表确定。 对于大于表中范围的列大小,则暗指小数位数为 7。 此转换应允许最高 9 位的秒的小数形式位数,这是 ODBC 允许的最大位数。

类型: DBTIME2

暗指的小数位数 0 8

隐式比例 1..7 10,16



类型: DBTIMESTAMP

表示确定位数 0: 19

隐含比例 1..7: 21..27



类型: DBTIMESTAMPOFFSET

表示确定位数 0: 26

隐式比例 1..7: 28..34

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

类型: DBTIME2

暗指的小数位数 0 8

暗指的小数位数 1..9 1..9



类型: DBTIMESTAMP

表示确定位数 0: 19

表示确定位数 1..9: 21..29



类型: DBTIMESTAMPOFFSET

表示确定位数 0: 26

表示确定位数 1..9: 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 (9.x) 和更早版本的行为将保持。

另请参阅

日期和时间改进 (ODBC)
日期和时间改进 (OLE DB)