共用方式為


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

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

格式檔案

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

檔案儲存類型 主檔案資料類型 提示的回應:「請輸入欄位 <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>  

字元資料類型

在字元資料檔中,日期和時間值會如 OLE DB 的 資料類型支援之 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

符號的索引鍵

符號 意義
- 不支援轉換。

系統會產生含有 SQLSTATE 07006 和訊息「限制的資料類型屬性違規」的 ODBC 診斷記錄。
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),會產生包含 SQLSTATE 22018 和訊息「轉換規格的字元值無效」的 ODBC 診斷記錄。 對於 datetime 和 smalldatetime 參數,如果年份超出這些類型支援的範圍,就會發佈錯誤 (OLE DB),或產生含有 SQLSATE 22007 和訊息「無效的 datetime 格式」的 ODBC 診斷記錄。

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

在伺服器轉換為用戶端時,這是一個警告 (ODBC SQLSTATE S1000)。

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

另請參閱

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