舊版 SQL Server 的增強日期和時間類型行為 (ODBC)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics 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 和「限制資料類型屬性違規」的訊息。

另請參閱

日期和時間改善 (ODBC)