分享方式:


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

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics 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) (或更新版本)。

只考慮下列常見的架構變更:

  • 使用以邏輯方式說,應用程式只需要日期或時間值的新類型。 不過,應用程式被迫使用 datetimesmalldatetime ,因為無法使用個別的日期和時間類型。

  • 使用新類型來取得額外的小數秒精確度或精確度。

  • 切換至 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)