舊版 SQL Server 的新日期和時間功能 (OLE DB)
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics 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) (或更新版本)。
只考慮下列常見的架構變更:
使用以邏輯方式說,應用程式只需要日期或時間值的新類型。 不過,應用程式被迫使用 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 的相容性
新的日期/時間類型允許所有比較運算符,因為它們會顯示為字串類型,而不是日期/時間類型。