增強日期與時間類型的大量複製變更 (OLE DB 和 ODBC)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics 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 與更新版本
不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 開發新的應用程式。
針對新專案,請使用下列其中一個驅動程式:
針對 SQL Server 資料庫引擎 (2012 到 2019 版) 的隨附元件 SQLNCLI,請參閱支援生命週期例外狀況。
格式檔案
以互動方式建立格式檔案時,下表描述用於指定日期/時間類型與對應主檔資料類型名稱的輸入。
檔案儲存類型 | 主檔案資料類型 | 提示的回應:「請輸入欄位 <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 數據檔所支援的最大值,不會儲存這些數據行的規模)。 現有 datetime 和 smalldatetime 類型的儲存或其表格式資料流 (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) 和先前的行為進行維護。 |
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: