舊版 SQL Server 的增強日期和時間類型行為 (ODBC)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Platform System (PDW)
本主題描述使用增強日期和時間功能的用戶端應用程式與 SQL Server 2008 之前的版本通訊時的預期行為(10.0.x),以及使用 Microsoft Data Access Components、Windows Data Access Components 或 SQL Server Native Client 版本早於 SQL Server 2008 (10.0.x) 的用戶端應用程式,將命令傳送至支持增強日期和時間功能的伺服器。
下層用戶端行為
使用 SQL Server 2008(10.0.x) 之前的 SQL Server Native Client 版本編譯的用戶端應用程式,會將新的日期/時間類型視為 nvarchar 數據行。 數據行內容是常值表示法,如 ODBC 日期和時間改善之數據類型支援的「數據格式:字串和常值」一節所述。 數據行大小是數據行所指定小數秒有效位數的最大常值長度。
目錄 API 會傳回與傳回至用戶端的下層數據類型程式碼一致的元數據(例如 nvarchar)和相關聯的下層表示法(例如,適當的常值格式)。 不過,傳回的數據類型名稱將會是實際的 SQL Server 2008 (10.0.x) 類型名稱。
SQLDescribeCol、SQLDescribeParam、SQGetDescField 和 SQLColAttribute 所傳回的語句元數據,會傳回所有方面與下層類型一致的元數據,包括類型名稱。 這類下層類型的範例是 nvarchar。
針對 SQL Server 2008 (10.0.x) (或更新版本) 伺服器執行下層用戶端應用程式時,架構變更為日期/時間類型的伺服器,預期的行為如下所示:
SQL Server 2005 類型 | SQL Server 2008 (10.0.x) (或更新版本) 類型 | ODBC 用戶端類型 | 結果轉換 (SQL 到 C) | 參數轉換 (C 到 SQL) |
---|---|---|---|---|
Datetime | Date | SQL_C_TYPE_DATE | 確定 | 確定 (1) |
SQL_C_TYPE_TIMESTAMP | 時間欄位設定為零。 | 確定 (2) 如果時間欄位非零,則失敗。 使用 SQL Server 2005 (9.x)。 |
||
Time(0) | SQL_C_TYPE_TIME | 確定 | 確定 (1) | |
SQL_C_TYPE_TIMESTAMP | 日期欄位設定為目前日期。 | 確定 (2) 忽略日期。 如果小數秒非零,則失敗。 使用 SQL Server 2005 (9.x)。 |
||
Time(7) | SQL_C_TIME | 失敗 - 無效的時間常值。 | 確定 (1) | |
SQL_C_TYPE_TIMESTAMP | 失敗 - 無效的時間常值。 | 確定 (1) | ||
Datetime2(3) | SQL_C_TYPE_TIMESTAMP | 確定 | 確定 (1) | |
Datetime2(7) | SQL_C_TYPE_TIMESTAMP | 確定 | 客戶端轉換的值會四捨五入為第 1/300 秒。 | |
Smalldatetime | Date | SQL_C_TYPE_DATE | [確定] | [確定] |
SQL_C_TYPE_TIMESTAMP | 時間欄位設定為零。 | 確定 (2) 如果時間欄位非零,則失敗。 使用 SQL Server 2005 (9.x)。 |
||
Time(0) | SQL_C_TYPE_TIME | [確定] | [確定] | |
SQL_C_TYPE_TIMESTAMP | 日期欄位設定為目前日期。 | 確定 (2) 忽略日期。 如果小數秒非零,則失敗。 使用 SQL Server 2005 (9.x)。 |
||
Datetime2(0) | SQL_C_TYPE_TIMESTAMP | [確定] | [確定] |
符號的索引鍵
符號 | 意義 |
---|---|
1 | 如果它與 SQL Server 2005 (9.x) 搭配運作,它應該會繼續使用較新版本的 SQL Server。 |
2 | 使用 SQL Server 2005 (9.x) 的應用程式可能會因為較新版本的 SQL Server 而失敗。 |
請注意,只考慮一般架構變更。 以下是常見的變更:
使用以邏輯方式說,應用程式只需要日期或時間值的新類型。 不過,由於沒有個別的日期和時間類型,應用程式被迫使用 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(10.0.x)的伺服器實例時,任何嘗試使用新的伺服器類型或相關聯的元數據碼和描述元字段,都會導致傳回SQL_ERROR。 診斷記錄將會產生 SQLSTATE HY004 和訊息「連線上的伺服器版本無效的 SQL 數據類型」,或具有 07006 和「限制數據類型屬性違規」的訊息。
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: