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 Native Client SQL Server 2008 (10.0.x) 向支持增强日期和时间功能的服务器发送命令。
下级客户端行为
使用早于 2008 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 | datetime | 日期 | 确定 | 确定 |
DBTYPE_DBTIMESTAMP | 时间字段设置为零。 | 如果时间字段为非零,IRowsetChange 将因字符串截断而失败。 | ||
DBTYPE_DBTIME | Time(0) | 确定 | 确定 | |
DBTYPE_DBTIMESTAMP | 日期字段设置为当前日期。 | 如果秒的小数部分为非零,IRowsetChange 将因字符串截断而失败。 忽略日期。 |
||
DBTYPE_DBTIME | Time(7) | 失败 - 时间文本无效。 | 确定 | |
DBTYPE_DBTIMESTAMP | 失败 - 时间文本无效。 | 确定 | ||
DBTYPE_DBTIMESTAMP | Datetime2 (3) | 确定 | 确定 | |
DBTYPE_DBTIMESTAMP | Datetime2 (7) | 确定 | 确定 | |
DBTYPE_DBDATE | Smalldatetime | 日期 | 确定 | 确定 |
DBTYPE_DBTIMESTAMP | 时间字段设置为零。 | 如果时间字段为非零,IRowsetChange 将因字符串截断而失败。 | ||
DBTYPE_DBTIME | Time(0) | 确定 | 确定 | |
DBTYPE_DBTIMESTAMP | 日期字段设置为当前日期。 | 如果秒的小数部分为非零,IRowsetChange 将因字符串截断而失败。 忽略日期。 |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | 确定 | 确定 |
正常意味着,如果它适用于 SQL Server 2005 (9.x) ,则它应继续使用 SQL Server 2008 (10.0.x) (或更高版本) 。
只考虑了以下常见的架构更改:
使用新类型,这种情况下在逻辑上应用程序只需要一个日期或时间值。 但是,应用程序被迫使用 datetime 或 smalldatetime ,因为单独的日期和时间类型不可用。
使用新类型以获得其他秒小数精度或准确性。
切换到 datetime2 ,因为这是日期和时间的首选数据类型。
使用通过 ICommandWithParameters::GetParameterInfo 或架构行集获取的服务器元数据通过 ICommandWithParameters::SetParameterInfo 设置参数类型信息的应用程序将在客户端转换期间失败,其中源类型的字符串表示形式大于目标类型的字符串表示形式。 例如,如果客户端绑定使用 DBTYPE_DBTIMESTAMP并且服务器列为 date,SQL Server Native Client会将值转换为“yyyy-dd-mm hh:mm:ss.fff”,但服务器元数据将以 nvarchar (10) 返回。 生成的溢出会导致 DBSTATUS_E_CATCONVERTVALUE。 IRowsetChange 的数据转换也出现了类似的问题,因为行集元数据是从结果集元数据设置的。
参数和行集元数据
本部分介绍使用早于 2008 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 的可比性
允许对新的日期/时间类型使用所有比较运算符,因为这些比较运算符显示为字符串类型,而不是显示为日期/时间类型。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈