舊版 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 類型名稱。

SQLDescribeColSQLDescribeParamSQGetDescField 以及 SQLColAttribute 傳回的陳述式中繼資料將會傳回與下層類型各方面都一致的中繼資料,包括類型名稱。這類下層類型的範例為 nvarchar。

當下層用戶端應用程式針對其結構描述已經變更為日期/時間類型的 SQL Server 2008 (或更新版本) 伺服器執行時,預期的行為如下所示:

SQL Server 2005 類型

SQL Server 2008 (或更新版本) 類型

ODBC 用戶端類型

結果轉換 (SQL 到 C)

參數轉換 (C 到 SQL)

Datetime

Date

SQL_C_TYPE_DATE

OK

OK (1)

SQL_C_TYPE_TIMESTAMP

時間欄位會設定為零。

OK (2)

如果時間欄位不為零,就會失敗。使用 SQL Server 2005。

Time(0)

SQL_C_TYPE_TIME

OK

OK (1)

SQL_C_TYPE_TIMESTAMP

日期欄位設定為目前的日期。

OK (2)

忽略日期。如果小數秒不是零,就會失敗。使用 SQL Server 2005。

Time(7)

SQL_C_TIME

失敗 – 無效的時間間隔。

OK (1)

SQL_C_TYPE_TIMESTAMP

失敗 – 無效的時間間隔。

OK (1)

Datetime2(3)

SQL_C_TYPE_TIMESTAMP

OK

OK (1)

Datetime2(7)

SQL_C_TYPE_TIMESTAMP

OK

用戶端轉換會將值捨入為 1/300 秒。

Smalldatetime

Date

SQL_C_TYPE_DATE

OK

OK

SQL_C_TYPE_TIMESTAMP

時間欄位會設定為零。

OK (2)

如果時間欄位不為零,就會失敗。使用 SQL Server 2005。

Time(0)

SQL_C_TYPE_TIME

OK

OK

SQL_C_TYPE_TIMESTAMP

日期欄位設定為目前的日期。

OK (2)

忽略日期。如果小數秒不是零,就會失敗。

使用 SQL Server 2005。

Datetime2(0)

SQL_C_TYPE_TIMESTAMP

OK

OK

符號的索引鍵

符號

意義

1

如果它使用 SQL Server 2005,則應繼續使用更新版的 SQL Server。

2

使用 SQL Server 2005 的應用程式可能會因為更新版的 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 的伺服器執行個體時,嘗試使用新的伺服器類型或相關聯的中繼資料程式碼和描述元欄位都會傳回 SQL_ERROR。系統將會產生包含 SQLSTATE HY004 和訊息「連接時,伺服器版本的 SQL 資料類型無效」的診斷記錄,或包含 07006 和訊息「限制的資料類型屬性違規」的診斷記錄。