舊版 SQL Server 的增強型日期/時間類型行為 (ODBC)
本主題描述使用增強型日期和時間增強功能的用戶端應用程式與早於 SQL Server 2008 之 SQL Server 版本進行通訊時,以及使用 Microsoft Data Access Components、Windows Data Access Components,或早於 SQL Server 2008 之 SQL Server Native Client 版本的應用程式將命令傳送到支援增強型日期和時間功能的伺服器時的預期行為。
下層用戶端行為
使用早於 SQL Server 2008 之 SQL Server Native Client 版本編譯的用戶端應用程式會將新的日期/時間類型視為 nvarchar 資料行。資料行內容為常值表示法,如<資料類型對 ODBC 日期/時間支援的改進>的「資料格式:字串和常值」一節中所述。資料行大小是針對資料行指定之小數秒有效位數的最大常值長度。
資料庫目錄 API 將會傳回與傳回到用戶端之下層資料類型程式碼一致的中繼資料 (例如,nvarchar),以及相關聯的下層表示法 (例如,適當的常值格式)。不過,傳回的資料類型名稱將會是實際的 SQL Server 2008 類型名稱。
SQLDescribeCol、SQLDescribeParam、SQGetDescField 以及 SQLColAttribute 傳回的陳述式中繼資料將會傳回與下層類型各方面都一致的中繼資料,包括類型名稱。此種下層類型的範例為 nvarchar。
當下層用戶端應用程式針對其結構描述已經變更為日期/時間類型的 SQL Server 2008 伺服器執行時,預期的行為如下所示:
SQL Server 2005 類型 |
SQL Server 2008 類型 |
ODBC 用戶端類型 |
結果轉換 (SQL 到 C) |
參數轉換 (C 到 SQL) |
---|---|---|---|---|
Datetime |
Date |
SQL_C_TYPE_DATE |
OK |
確定 |
SQL_C_TYPE_TIMESTAMP |
時間欄位會設定為零。 |
確定 如果時間欄位不為零,就會失敗。使用 SQL Server 2005。 |
||
Time(0) |
SQL_C_TYPE_TIME |
OK |
確定 |
|
SQL_C_TYPE_TIMESTAMP |
日期欄位設定為目前的日期。 |
確定 忽略日期。如果小數秒不是零,就會失敗。使用 SQL Server 2005。 |
||
Time(7) |
SQL_C_TIME |
失敗 – 無效的時間間隔。 |
確定 |
|
SQL_C_TYPE_TIMESTAMP |
失敗 – 無效的時間間隔。 |
確定 |
||
Datetime2(3) |
SQL_C_TYPE_TIMESTAMP |
OK |
確定 |
|
Datetime2(7) |
SQL_C_TYPE_TIMESTAMP |
OK |
用戶端轉換會將值捨入為 1/300 秒。 |
|
Smalldatetime |
Date |
SQL_C_TYPE_DATE |
OK |
OK |
SQL_C_TYPE_TIMESTAMP |
時間欄位會設定為零。 |
確定 如果時間欄位不為零,就會失敗。使用 SQL Server 2005。 |
||
Time(0) |
SQL_C_TYPE_TIME |
OK |
OK |
|
SQL_C_TYPE_TIMESTAMP |
日期欄位設定為目前的日期。 |
確定 忽略日期。如果小數秒不是零,就會失敗。 使用 SQL Server 2005。 |
||
Datetime2(0) |
SQL_C_TYPE_TIMESTAMP |
OK |
OK |
符號的索引鍵
符號 |
意義 |
---|---|
1 |
如果它使用 SQL Server 2005,則應該繼續使用 SQL Server 2008。 |
2 |
使用 SQL Server 2005 的應用程式可能會因為 SQL Server 2008 而失敗。 |
請注意,只有最常見的結構描述變更已經列入考慮。以下是最常見的變更:
在符合邏輯之處使用新的類型時,應用程式僅需要一個日期或時間值。不過,系統會強迫應用程式使用 datetime 或 smalldatetime,因為沒有個別的日期和時間類型。
使用新類型會得到額外的小數秒精確度或正確度。
切換到 datetime2,因為這是慣用的日期和時間資料類型。
SQLColumns、SQLProcedureColumns 和 SQLSpecialColumns 傳回的資料行中繼資料
系統會傳回日期/時間類型的下列資料行値:
資料行類型 |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
COLUMN_SIZE |
10 |
8,10..16 |
16 |
23 |
19, 21..27 |
26, 28..34 |
BUFFER_LENGTH |
20 |
16, 20..32 |
16 |
16 |
38, 42..54 |
52, 56..68 |
DECIMAL_DIGITS |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
SQL_DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME |
SQL_DATETIME |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME_SUB |
NULL |
NULL |
SQL_CODE_TIMESTAMP |
SQL_CODE_TIMESTAMP |
NULL |
NULL |
CHAR_OCTET_LENGTH |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
SS_DATA_TYPE |
0 |
0 |
111 |
111 |
0 |
0 |
SQLSpecialColumns 不會傳回 SQL_DATA_TYPE、SQL_DATETIME_SUB、CHAR_OCTET_LENGTH 或 SS_DATA_TYPE。
SQLGetTypeInfo 傳回的資料類型中繼資料
系統會傳回日期/時間類型的下列資料行値:
資料行類型 |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
COLUMN_SIZE |
10 |
16 |
16 |
23 |
27 |
34 |
LITERAL_PREFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
LITERAL_SUFFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
CREATE_PARAMS |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
SQL_NULLABLE |
CASE_SENSITIVE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
SQL_PRED_SEARCHABLE |
UNSIGNED_ATTRIBUTE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
FXED_PREC_SCALE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
SQL_FALSE |
AUTO_UNIQUE_VALUE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
LOCAL_TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
MINIMUM_SCALE |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
MAXIMUM_SCALE |
NULL |
NULL |
0 |
3 |
NULL |
NULL |
SQL_DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME |
SQL_DATETIME |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_DATETIME_SUB |
NULL |
NULL |
SQL_CODE_TIMESTAMP |
SQL_CODE_TIMESTAMP |
NULL |
NULL |
NUM_PREC_RADIX |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
INTERVAL_PRECISION |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
USERTYPE |
0 |
0 |
12 |
22 |
0 |
0 |
下層伺服器行為
連接到舊版 SQL Server 2008 的伺服器執行個體時,嘗試使用新的伺服器類型或相關聯的中繼資料程式碼和描述元欄位都會傳回 SQL_ERROR。系統將會產生包含 SQLSTATE HY004 和訊息「連接時,伺服器版本的 SQL 資料類型無效」的診斷記錄,或包含 07006 和訊息「限制的資料類型屬性違規」的診斷記錄。