SQL Server 早期版本的新日期和时间功能 (OLE DB)

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

本主题介绍使用增强的日期和时间功能的客户端应用程序与 SQL Server 2008(10.0.x)之前的 SQL Server 版本通信时以及使用 SQL Server 2008(10.0.x)之前的 SQL Server Native Client 版本编译的客户端向支持增强日期和时间功能的服务器发送命令时的预期行为。

下级客户端行为

使用早于 SQL Server 2008 (10.0.x) 版本的 SQL Server Native Client 的客户端应用程序将新的日期/时间类型视为 nvarchar 列。 这些列内容是文字表示。 有关详细信息,请参阅 OLE DB 日期和时间改进数据类型支持的“数据格式:字符串和文本”部分。 列大小是为列指定的精度的最大文字长度。

目录 API 将返回与返回到客户端的下层数据类型代码(例如 nvarchar)和关联的下层表示形式(例如,适当的文本格式)一致的元数据。 但是,返回的数据类型名称将是真正的 SQL Server 2008 (10.0.x) 类型名称。

当下级客户端应用程序针对已对架构更改到日期/时间类型的 SQL Server 2008 (10.0.x) (或更高版本)服务器运行时,预期行为如下所示:

OLE DB 客户端类型 SQL Server 2005 类型 SQL Server 2008(或更高版本)类型 结果转换(服务器到客户端) 参数转换(客户端到服务器)
DBTYPE_DBDATE 日期/时间 日期 OK OK
DBTYPE_DBTIMESTAMP 时间字段设置为零。 如果时间字段为非零,则 IRowsetChange 由于字符串截断而失败。
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP 日期字段设置为当前日期。 如果小数秒为非零,IRowsetChange 将因字符串截断而失败。

忽略日期。
DBTYPE_DBTIME Time(7) 失败 - 无效的时间文本。 OK
DBTYPE_DBTIMESTAMP 失败 - 无效的时间文本。 OK
DBTYPE_DBTIMESTAMP Datetime2(3) OK OK
DBTYPE_DBTIMESTAMP Datetime2(7) OK OK
DBTYPE_DBDATE Smalldatetime 日期 OK OK
DBTYPE_DBTIMESTAMP 时间字段设置为零。 如果时间字段为非零,则 IRowsetChange 由于字符串截断而失败。
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP 日期字段设置为当前日期。 如果小数秒为非零,IRowsetChange 将因字符串截断而失败。

忽略日期。
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

正常表示,如果它与 SQL Server 2005(9.x)一起使用,它应继续使用 SQL Server 2008 (10.0.x) (或更高版本)。

只考虑了以下常见的架构更改:

  • 使用新类型,这种情况下在逻辑上应用程序只需要一个日期或时间值。 但是,应用程序被迫使用 datetimesmalldatetime ,因为不同的日期和时间类型不可用。

  • 使用新类型以获得其他秒小数精度或准确性。

  • 切换到 datetime2,因为这是日期和时间的首选数据类型。

使用通过 ICommandWithParameters::GetParameterInfo 或架构行集获取的服务器元数据通过 ICommandWithParameters::SetParameterInfo 设置参数类型信息的应用程序将在客户端转换期间失败,其中源类型的字符串表示形式大于目标类型的字符串表示形式。 例如,如果客户端绑定使用DBTYPE_DBTIMESTAMP且服务器列为日期,则 SQL Server Native Client 会将值转换为“yyy-dd-mm hh:mm:ss.fff”,但服务器元数据将作为 nvarchar(10)返回。 生成的溢出会导致DBSTATUS_E_CANTCONVERTVALUE。 IRowsetChange 的数据转换也出现了类似的问题,因为行集元数据是从结果集元数据设置的。

参数和行集元数据

本部分介绍使用低于 SQL Server 2008(10.0.x)版本的 SQL Server Native Client 编译的客户端的参数、结果列和架构行集的元数据。

ICommandWithParameters::GetParameterInfo

DBPARAMINFO 结构通过 prgParamInfo 参数返回以下信息:

参数类型 wType ulParamSize bPrecision bScale
date DBTYPE_WSTR 10 ~0 ~0
time DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

请注意,某些值范围不是连续的,例如,8,10..16 中缺少 9。 这是因为当小数精度大于零时添加了小数点。

IColumnsRowset::GetColumnsRowset

会返回以下列:

列类型 DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE、DBCOLUMN_DATETIMEPRECISION
date DBTYPE_WSTR 10 Null Null
time DBTYPE_WSTR 8, 10..16 Null Null
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 Null Null
datetimeoffset DBTYPE_WSTR 26,28..34 Null Null

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 结构返回以下信息:

参数类型 wType ulColumnSize bPrecision bScale
date DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

架构行集

本部分论述了新数据类型的参数、结果列以及架构行集的元数据。 此信息非常有用,你拥有使用早于 SQL Server 2008 (10.0.x) SQL Server Native Client 的工具开发的客户端提供程序。

COLUMNS 行集

对于日期/时间类型将返回以下列值:

列类型 DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
date DBTYPE_WSTR 10 20 Null
time DBTYPE_WSTR 8, 10..16 16,20..32 Null
smalldatetime DBTYPE_DBTIMESTAMP Null Null 0
datetime DBTYPE_DBTIMESTAMP Null Null 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 Null
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 Null

PROCEDURE_PARAMETERS 行集

对于日期/时间类型将返回以下列值:

列类型 DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
date DBTYPE_WSTR 10 20 date
time DBTYPE_WSTR 8, 10..16 16,20..32 time
smalldatetime DBTYPE_DBTIMESTAMP Null Null smalldatetime
datetime DBTYPE_DBTIMESTAMP Null Null datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

PROVIDER_TYPES 行集

对于日期/时间类型将返回以下行:

类型 ->

date time smalldatetime datetime datetime2 datetimeoffset
TYPE_NAME date time smalldatetime datetime datetime2 datetimeoffset
DATA_TYPE DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX
LITERAL_SUFFIX
CREATE_PARAMS Null Null Null Null Null Null
IS_NULLABLE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE
CASE_SENSITIVE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE Null Null Null Null Null Null
FIXED_PREC_SCALE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
AUTO_UNIQUE_VALUE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
LOCAL_TYPE_NAME date time smalldatetime datetime datetime2 datetimeoffset
MINIMUM_SCALE Null Null Null Null Null Null
MAXIMUM_SCALE Null Null Null Null Null Null
GUID Null Null Null Null Null Null
TYPELIB Null Null Null Null Null Null
VERSION Null Null Null Null Null Null
IS_LONG VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
BEST_MATCH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_TRUE VARIANT_FALSE VARIANT_FALSE
IS_FIXEDLENGTH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE

下级服务器行为

当连接到低于 SQL Server 2008(10.0.x)的服务器时,任何尝试使用新服务器类型名称(例如,使用 ICommandWithParameters::SetParameterInfo 或 ITableDefinition::CreateTable)将导致DB_E_BADTYPENAME。

如果在不使用类型名称的情况下针对参数或结果绑定新类型,且新类型用于隐式指定服务器类型,或服务器类型到客户端类型之间没有有效的转换,则将返回 DB_E_ERRORSOCCURRED,且 DBBINDSTATUS_UNSUPPORTED_CONVERSION 设置为在执行时使用的取值函数的绑定状态。

如果在连接时支持从缓冲区类型到服务器版本的服务器类型之间的客户端转换,则可以使用所有客户端缓冲区类型。 在此上下文中, 服务器类型 表示 ICommandWithParameters::SetParameterInfo 指定的类型,如果未调用 ICommandWithParameters::SetParameterInfo,则表示缓冲区类型隐含的类型。 这意味着 DBTYPE_DBTIME2 和 DBTYPE_DBTIMESTAMPOFFSET 可用于下级服务器,或在 DataTypeCompatibility=80 时,对支持的服务器类型的客户端转换成功的情况下,也可使用。 当然,如果服务器类型不正确,且该服务器类型不能执行对实际服务器类型的隐式转换,则服务器仍可能报告错误。

SSPROP_INIT_DATATYPECOMPATIBILITY 行为

当SSPROP_INIT_DATATYPECOMPATIBILITY设置为SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000时,新日期/时间类型和关联的元数据在客户端显示为下层客户端时显示,如增强的日期和时间类型的大容量复制更改(OLE DB 和 ODBC)中所述

IRowsetFind 的可比性

允许对新的日期/时间类型使用所有比较运算符,因为这些比较运算符显示为字符串类型,而不是显示为日期/时间类型。

另请参阅

日期和时间改进 (OLE DB)