增強日期和時間類型的大量複製變更 (OLE DB 和 ODBC)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

本主題描述支援大量複製功能的日期/時間增強功能。 本主題中的資訊適用于 SQL Server Native Client 中的 OLE DB 和 ODBC。

重要

SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除。 不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 開發新的應用程式。 往後請改用新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新的 Microsoft ODBC Driver for SQL Server。 如需 SQL Server 資料庫引擎元件隨附的 SQLNCLI(版本 2012 到 2019),請參閱此 支援生命週期例外狀況

格式檔案

以互動方式建立格式檔案時,下表描述用於指定日期/時間類型與對應主檔資料類型名稱的輸入。

檔案儲存類型 主檔案資料類型 提示的回應:「請輸入欄位 <field_name> [<default>] 的檔案儲存類型:」
Datetime SQLDATETIME d
Smalldatetime SQLDATETIM4 D
Date SQLDATE de
Time SQLTIME te
Datetime2 SQLDATETIME2 d2
Datetimeoffset SQLDATETIMEOFFSET do

XML 格式檔案 XSD 將具備下列加入項目:

<xs:complexType name="SQLDATETIME2">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  
<xs:complexType name="SQLDATETIMEOFFSET">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  
<xs:complexType name="SQLDATE">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  
<xs:complexType name="SQLTIME">  
    <xs:complexContent>  
        <xs:extension base="bl:Fixed"/>  
    </xs:complexContent>  
</xs:complexType>  

字元資料類型

在字元資料檔中,日期和時間值會如 ODBC 日期和時間改善 之資料類型支援的「資料格式:字串和常值」一節 所述來表示,或是 OLE DB 日期和時間改進 的資料類型支援。

在原生資料中,這四個新類型的日期和時間值會以 7 小數位數來表示其 TDS 標記法(因為這是 SQL Server 和 bcp 資料檔案所支援的最大值,不會儲存這些資料行的規模)。 現有 datetimesmalldatetime 類型的儲存或其表格式資料流 (TDS) 表示法沒有變更。

對於 OLE DB,不同儲存類型的儲存大小如下所示:

檔案儲存類型 儲存體大小 (以位元組為單位)
Datetime 8
smalldatetime 4
date 3
time 6
datetime2 9
datetimeoffset 11

ODBC 的大小如下所示。 請注意,不需要以格式或資料檔案儲存有效位數,因為 BCP.exe 一律會從伺服器擷取有效位數。

檔案儲存類型 儲存體大小 (以位元組為單位) 儲存體格式
datetime (d) 8 TDS
Smalldatetime (D) 4 TDS
date (de) 3 TDS
time (te) 6 TDS
datetime2 (d2) 9 TDS
datetimeoffset (do) 11 TDS

sqlncli.h 中的 BCP 類型

下列類型定義在 sqlncli.h 中,以搭配 ODBC 的 BCP API 延伸模組使用。 這些類型會利用 OLE DB 中 IBCPSession::BCPColFmt 的 eUserDataType 參數來傳遞。

檔案儲存類型 主檔案資料類型 輸入 sqlncli.h 以搭配 IBCPSession::BCPColFmt 使用
Datetime SQLDATETIME BCP_TYPE_SQLDATETIME 0x3d
Smalldatetime SQLDATETIM4 BCP_TYPE_SQLDATETIME4 0x3a
Date SQLDATE BCP_TYPE_SQLDATE 0x28
Time SQLTIME BCP_TYPE_SQLTIME 0x29
Datetime2 SQLDATETIME2 BCP_TYPE_SQLDATETIME2 0x2a
Datetimeoffset SQLDATETIMEOFFSET BCP_TYPE_SQLDATETIMEOFFSET 0x2b

BCP 資料類型轉換

下表提供轉換資訊。

OLE DB 注意:下列轉換是由 IBCPSession 所執行。 IRowsetFastLoad 會使用如從用戶端到伺服器執行的轉換中所定義的 OLE DB 轉換。 請注意,datetime 值會捨入為一秒的 1/300,而 smalldatetime 值在執行以下所描述的用戶端轉換之後,會將其秒數設定為零。 Datetime 捨入會透過小時和分鐘 (但非日期) 傳播。

至 -->

date time smalldatetime Datetime datetime2 datetimeoffset char wchar
Date 1 - 1,6 1,6 1,6 1,5,6 1,3 1,3
Time N/A 1,10 1,7,10 1,7,10 1,7,10 1,5,7,10 1,3 1,3
Smalldatetime 1,2 1,4,10 1 1 1,10 1,5,10 1,11 1,11
Datetime 1,2 1,4,10 1,12 1 1,10 1,5,10 1,11 1,11
Datetime2 1,2 1,4,10 1,10 (ODBC)1,12 (OLE DB) 1,10 1,10 1,5,10 1,3 1,3
Datetimeoffset 1,2,8 1,4,8,10 1,8,10 1,8,10 1,8,10 1,10 1,3 1,3
Char/wchar (date) 9 - 9,6 (ODBC)9,6,12 (OLE DB) 9,6 (ODBC)9,6,12 (OLE DB) 9,6 9,5,6 N/A N/A
Char/wchar (time) - 9,10 9,7,10 (ODBC)9,7,10,12 (OLE DB) 9,7,10 (ODBC)9,7,10, 12 (OLE DB) 9,7,10 9,5,7,10 N/A N/A
Char/wchar (datetime) 9,2 9,4,10 9,10 (ODBC)9,10,12 (OLE DB) 9,10 (ODBC)9,10,12 (OLE DB) 9,10 9,5,10 N/A N/A
Char/wchar (datetimeoffset) 9,2,8 9,4,8,10 9,8,10 (ODBC)9,8,10,12 (OLE DB) 9,8,10 (ODBC)9,8,10,12 (OLE DB) 9,8,10 9,10 N/A N/A

符號的索引鍵

符號 意義
- 不支援轉換。

ODBC 診斷記錄會產生 SQLSTATE 07006 和訊息「限制資料類型屬性違規」。
1 如果提供的資料無效,則會使用 SQLSTATE 22007 和訊息「不正確日期時間格式」產生 ODBC 診斷記錄。 對於 datetimeoffset 值,即使沒有要求轉換為 UTC,此時間部分在轉換到 UTC 之後仍然必須在範圍內。 這是因為 TDS 和伺服器永遠會以 UTC 的 datetimeoffset 值,正規化時間。 因此,用戶端必須確認時間元件在轉換為 UTC 之後,仍然位於支援的範圍內。
2 忽略時間元件。
3 若為 ODBC,如果發生資料遺失截斷,則會使用 SQLSTATE 22001 產生診斷記錄,而訊息 「字串資料,右截斷」小數秒數(小數秒數)數目會根據下表從目的地資料行的大小決定。 對於大於資料表範圍的資料行大小,隱含 7 小數位數。 此轉換應允許最多九個小數秒位數,這是 ODBC 允許的最大值。

類型: DBTIME2

隱含的小數位數 0: 8

隱含小數位數 1..7 10,16



類型: DBTIMESTAMP

隱含的範圍 0: 19

隱含小數位數 1..7: 21..27



類型: DBTIMESTAMPOFFSET

隱含的範圍 0: 26

隱含小數位數 1..7: 28..34

針對 OLE DB,如果發生資料遺失的截斷,就會張貼錯誤。 對於 datetime2,小數秒的位數 (小數位數) 會根據下表,從目的地資料行的大小決定。 對於大於資料表範圍的資料行大小,隱含 9 小數位數。 此轉換應該最多允許九個小數秒位數,也就是 OLE DB 所允許的最大值。

類型: DBTIME2

隱含的小數位數 0: 8

隱含的小數位數 1..9: 1..9



類型: DBTIMESTAMP

隱含的範圍 0: 19

隱含的範圍 1..9: 21..29



類型: DBTIMESTAMPOFFSET

隱含的範圍 0: 26

隱含的範圍 1..9: 28..36
4 忽略日期元件。
5 時區會設定為 UTC (例如,00:00)。
6 時間會設定為零。
7 日期會設定為 1900-01-01。
8 忽略時區位移。
9 根據出現的第一個標點符號字元以及剩餘的元件是否存在,字串會經過剖析,並轉換為 date、datetime、datetimeoffset 或 time 值。 接著,字串會轉換成目標型別,並遵循本主題結尾的表格中的規則,以取得此程式所探索的來源類型。 如果提供的資料無法剖析而沒有錯誤,或任何元件元件元件超出允許的範圍,或如果沒有從常數值型別轉換成目標型別,則會張貼錯誤 (OLE DB), 或 ODBC 診斷記錄是由 SQLSTATE 22018 產生,以及訊息「轉換規格的字元值無效」。 對於 datetime 和 Smalldatetime 參數,如果年份超出這些類型支援的範圍,就會張貼錯誤(OLE DB)或 ODBC 診斷記錄,並產生 SQLSATE 22007 和訊息「不正確日期時間格式」。

對於 datetimeoffset,即使沒有要求轉換為 UTC,此值在轉換到 UTC 之後仍然必須在範圍內。 這是因為 TDS 和伺服器永遠會以 UTC 的 datetimeoffset 值,將時間正規化,因此用戶端必須在轉換成 UTC 之後,確認時間元件位於支援的範圍內。 如果值不在支援的 UTC 範圍內,則會張貼錯誤(OLE DB),或以 SQLSTATE 22007 和訊息「不正確日期時間格式」產生 ODBC 診斷記錄。
10 如果在用戶端到伺服器轉換時發生資料遺失的截斷,則會張貼錯誤(OLE DB),或產生 ODBC 診斷記錄與 SQLSTATE 22008 和訊息「Datetime 欄位溢位」。 如果此值落在伺服器使用之 UTC 範圍所代表的範圍外,也可能發生這個錯誤。 如果在從伺服器轉換為用戶端時發生秒或小數秒的截斷,只會有一個警告。
11 如果發生資料遺失的截斷,就會產生診斷記錄。

在伺服器對用戶端轉換上,這是警告 (ODBC SQLSTATE S1000)。

在用戶端對伺服器轉換上,這是錯誤 (ODBC SQLSTATE 22001)。
12 秒數會設定為零,而小數秒會遭到捨棄。 不可能發生截斷錯誤。
N/A 會對現有的 SQL Server 2005 (9.x) 和先前的行為進行維護。

另請參閱

日期和時間改善 (ODBC)
日期和時間改善 (OLE DB)