Share via


舊版 SQL Server 的新日期和時間功能 (OLE DB)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

本主題描述使用增強日期和時間功能的用戶端應用程式與 SQL Server 2008 之前的版本通訊時的預期行為(10.0.x),以及使用 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 Datetime Date [確定] [確定]
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 Date [確定] [確定]
DBTYPE_DBTIMESTAMP 時間欄位設定為零。 如果時間欄位非零,IRowsetChange 將會因為字串截斷而失敗。
DBTYPE_DBTIME Time(0) [確定] [確定]
DBTYPE_DBTIMESTAMP 日期欄位設定為目前日期。 如果小數秒非零,IRowsetChange 將會因為字串截斷而失敗。

會忽略日期。
DBTYPE_DBTIMESTAMP Datetime2(0) [確定] [確定]

OK 表示如果它使用 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 的資料轉換也出現了類似的問題,因為資料列集中繼資料是從結果集中繼資料設定。

參數和資料列集中繼資料

本節說明使用 SQL Server 2008 之前版本 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設定為 Execute 所使用存取子的系結狀態。

如果支援用戶端從緩衝區類型轉換為連線上伺服器版本的伺服器類型,則可以使用所有用戶端緩衝區類型。 在此內容中, 伺服器類型 表示 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)