使用原生格式匯入或匯出資料

在多個 MicrosoftSQL Server 執行個體之間,使用不包含任何擴充/雙位元組字集 (DBCS) 字元的資料檔大量傳送資料時,建議使用原生格式。

[!附註]

若要在多個 SQL Server 執行個體之間,使用包含擴充或 DBCS 字元的資料檔大量傳送資料,您應該使用 Unicode 原生格式。如需詳細資訊,請參閱<使用 Unicode 原生格式匯入或匯出資料>。

原生格式會維持資料庫的原生資料類型。原生格式的目的是為了在 SQL Server 資料表之間進行資料的高速資料傳送。如果您使用格式檔案,則來源與目標資料表不需要相同。資料傳送包含兩個步驟:

  1. 將來源資料表中的資料大量匯出到資料檔

  2. 將資料檔中的資料大量匯入目標資料表

在相同資料表之間使用原生格式,可避免資料類型與字元格式間進行不需要的來回轉換,因而可節省時間及空間。不過,若要取得最佳的傳輸率,必須針對資料格式化做一些檢查。若要防止所載入的資料發生問題,請參閱下列限制清單。

限制

若要以原生格式成功匯入資料,請確定:

  • 資料檔具有原生格式。

  • 目標資料表必須與資料檔相容 (具有正確的資料行數目、資料類型、長度、NULL 狀態等等),否則您必須使用格式檔案,將每一個欄位對應到它的對應資料行。

    [!附註]

    如果您從與目標資料表不相符的檔案匯入資料,匯入作業或許會成功,但是插入目標資料表的資料值可能不正確。原因是檔案中的資料是使用目標資料表的格式來解譯。因此,任何不相符都會導致插入的值不正確。不過,這樣的不相符在任何情況下,都不會導致資料庫中發生邏輯或實體不一致性。

    如需使用格式檔案的資訊,請參閱<用於匯入或匯出資料的格式檔案>。

成功的匯入作業不會損毀目標資料表。

bcp 如何處理原生格式的資料

本節討論 bcp 公用程式如何匯出及匯入原生格式資料的特殊考量。

  • 非字元資料

    bcp 公用程式使用 SQL Server 內部二進位資料格式,將資料表中的非字元資料寫入資料檔。

  • char 或 varchar 資料

    在每一個 char 或 varchar 欄位的開頭,bcp 都會加入前置長度。

    重要注意事項重要事項

    使用原生模式時,依預設,bcp 公用程式會將 SQL Server 中的字元轉換為 OEM 字元,然後再將它們複製到資料檔。bcp 公用程式會將資料檔中的字元轉換為 ANSI 字元,然後再將它們大量匯入 SQL Server 資料表。在進行這些轉換期間,可能會遺失擴充字元。如有擴充字元,請使用 Unicode 原生格式或指定字碼頁。如需使用字碼頁的詳細資訊,請參閱<在不同的定序間複製資料>。

  • sql_variant 資料

    如果 sql_variant 資料以原生格式資料檔儲存為 SQLVARIANT,則資料會維持它所有的特性。用來記錄每一個資料值的資料類型的中繼資料,會與資料值一起儲存。中繼資料是用來以目的地 sql_variant 資料行中相同的資料類型,重新建立資料值。

    如果目的地資料行的資料類型不是 sql_variant,則每一個資料值將依照隱含資料轉換的一般規則,轉換為目的地資料行的資料類型。如果資料轉換期間發生錯誤,將會回復目前批次。任何在 sql_variant 資料行之間傳送的 char 及 varchar 值,都有可能有字碼頁轉換問題。如需詳細資訊,請參閱<在不同的定序間複製資料>。

    如需資料轉換的詳細資訊,請參閱<資料類型轉換 (Database Engine)>。

原生格式的命令選項

您可以將原生格式資料匯入資料表,方法為使用 bcp, BULK INSERT 或 INSERT ...SELECT * FROM OPENROWSET(BULK...)。針對 bcp 命令或 BULK INSERT 陳述式,您可以在命令列上指定資料格式。針對 INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式,您必須在格式檔案中指定資料格式。

下列命令列選項支援原生格式:

命令

選項

描述

bcp

-n

造成 bcp 公用程式使用資料的原生資料類型。1

BULK INSERT

DATAFILETYPE ='native'

使用資料的原生或 widenative 資料類型。請注意,如果有用格式檔案指定資料類型,就不需要 DATAFILETYPE。

1 若要將原生 (-n) 資料載入與舊版 SQL Server 用戶端相容的格式,請使用 -V 參數。如需詳細資訊,請參閱<從舊版 SQL Server 匯入原生與字元格式資料>。

如需詳細資訊,請參閱<bcp 公用程式>、<BULK INSERT (Transact-SQL)>或<OPENROWSET (Transact-SQL)>。

[!附註]

或者,您可以在格式檔案中按照每個欄位指定格式。如需詳細資訊,請參閱<用於匯入或匯出資料的格式檔案>。

範例

下列範例示範如何使用 bcp 大量匯出原生資料,以及使用 BULK INSERT 大量匯入相同的資料。

範例資料表

這些範例需要在 AdventureWorks 範例資料庫中,以 dbo 結構描述建立一個名為 myTestNativeData 的資料表。您必須先建立這個資料表,才能執行範例。在 SQL Server Management Studio 查詢編輯器中,執行:

USE AdventureWorks;
GO
CREATE TABLE myTestNativeData (
   Col1 smallint,
   Col2 nvarchar(50),
   Col3 nvarchar(50)
   ); 

若要擴展這個資料表及檢視產生的內容,請執行下列陳述式:

INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(1,'DataField2','DataField3');
INSERT INTO myTestNativeData(Col1,Col2,Col3)
   VALUES(2,'DataField2','DataField3');
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData

使用 bcp 大量匯出原生資料

若要從資料表匯出資料至資料檔,請使用 bcp 配合 out 選項與下列限定詞:

限定詞

描述

-n

指定原生資料類型。

-T

指定 bcp 公用程式使用整合式安全性的信任連接,來連接到 SQL Server。如果未指定 -T,您必須指定 -U-P 才能成功登入。

下列範例會以原生格式從 myTestNativeData 資料表,將資料大量匯出至名為 myTestNativeData-n.Dat 資料檔的新資料檔。在 Microsoft Windows 命令提示字元中,輸入:

bcp AdventureWorks..myTestNativeData out C:\myTestNativeData-n.Dat -n -T

使用 BULK INSERT 大量匯入原生資料

下列範例使用 BULK INSERT 將 myTestNativeData-n.Dat 資料檔中的資料匯入至 myTestNativeData 資料表。在 SQL Server Management Studio 查詢編輯器中,執行:

USE AdventureWorks;
GO
BULK INSERT myTestNativeData 
    FROM 'C:\myTestNativeData-n.Dat' 
   WITH (DATAFILETYPE='native'); 
GO
SELECT Col1,Col2,Col3 FROM myTestNativeData
GO