適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
Analytics Platform System (PDW)
使用含有擴充/DBCS 字元的資料檔案在多個 SQL Server 執行個體之間大量傳送資料時,建議使用 Unicode 字元格式。 Unicode 字元數據格式允許從伺服器匯出數據,方法是使用與執行作業之用戶端所使用的代碼頁不同的代碼頁。 在此情況下,使用 Unicode 字元格式具有下列優點:
如果來源資料和目的地資料都是 Unicode 資料類型,使用 Unicode 字元格式可保留所有的字元資料。
如果來源和目的地數據不是 Unicode 資料類型,則使用 Unicode 字元格式可將源數據中無法表示的擴充字元遺失降到最低。
使用 Unicode 字元格式的考慮
使用 Unicode 字元格式時,請考慮:
bcp 公用程式 預設會使用製表符號來分隔字元資料的欄位,並用新行字元來終止記錄。 如需如何指定替代結束符的資訊,請參閱 指定欄位和資料列終止符 (SQL Server) 。
儲存在 Unicode 字元格式資料檔的 sql_variant 資料,其操作方式和在字元格式資料檔中相同,不同之處在於資料是儲存為 nchar ,而非 char 資料。 如需字元格式的詳細資訊,請參閱 定序和 Unicode 支援。
使用 Unicode 字元格式、bcp 和格式檔案的特殊考慮
Unicode 字元格式資料檔遵循 Unicode 檔案的慣例。 檔案的前兩個位元組是十六進位數字 0xFFFE。 這些位元組作為位元組順序標記 (BOM),用來指定在將高位位元組儲存到檔案中時的先後順序。 bcp 公用程式可能會錯誤解譯 BOM,並導致匯入程式的一部分失敗;您可能會收到類似如下的錯誤訊息:
Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification
在下列情況下,位元組順序標記 (BOM) 可能會被誤解:
使用 bcp 公用程式,並使用
-w
參數來指出 Unicode 字元使用了格式檔案。
資料檔案中的第一個欄位不是字元。
請考慮下列任何因應措施是否適用於您的 特定 情況:
不使用格式檔案。 此因應措施的範例是 使用 bcp 和 Unicode 字元格式匯入沒有格式檔案的數據,
使用
-c
參數,替代-w
。使用原生格式重新匯出資料。
使用 BULK INSERT (Transact-SQL) 或 OPENROWSET (Transact-SQL)。 這些因應措施的範例提供於區段:使用 BULK INSERT 與 Unicode 字元格式搭配非 XML 格式檔案和使用 OPENROWSET 與 Unicode 字元格式搭配非 XML 格式檔案。
在目的地數據表中手動插入第一筆記錄,然後使用
-F 2
switch 在第二筆記錄上開始匯入,在數據檔中手動插入假資料的第一筆記錄,然後使用
-F 2
參數使匯入從第二筆記錄開始。 此因應措施的範例是 使用 bcp 和 Unicode 字元格式匯入非 XML 格式檔案 區段的數據,使用有第一個資料行為字元資料類型的暫存資料表,或
重新匯出數據並變更數據欄位順序,讓第一個數據欄位是字元。 接著使用格式檔案,將資料欄位重新對應到資料表中的實際順序。 如需範例,請參閱 使用格式檔案將資料表資料行對應至資料檔案欄位 (SQL Server) 。
Unicode 字元格式的命令選項
您可以使用 bcp、 BULK INSERT 或 OPENROWSET,將 Unicode 字元格式數據匯入數據表。 針對 bcp 命令或 BULK INSERT 語句,您可以在 語句中指定資料格式。 對於 OPENROWSET 語句,您必須在格式檔案中指定資料格式。
下列命令列選項支援 Unicode 字元格式:
命令 | 選項 | 描述 |
---|---|---|
bcp |
-w |
使用 Unicode 字元格式。 |
BULK INSERT |
DATAFILETYPE ='widechar' |
大量匯入資料時,使用 Unicode 字元格式。 |
OPENROWSET |
N/A | 必須使用格式檔案 |
注意
或者,您可以在格式檔案中按照每個欄位指定格式。 如需詳細資訊,請參閱 格式化檔案以匯入或匯出資料 (SQL Server) 。
範例測試條件
本文中的範例是以下表和格式檔案為基礎。
範例數據表
下列文本會建立測試資料庫、名為 myWidechar
的數據表,並以一些初始值填入數據表。 在 Microsoft SQL Server Management Studio (SSMS) 中執行下列 Transact-SQL:
CREATE DATABASE TestDatabase;
GO
USE TestDatabase;
CREATE TABLE dbo.myWidechar
(
PersonID SMALLINT NOT NULL,
FirstName NVARCHAR (25) NOT NULL,
LastName NVARCHAR (30) NOT NULL,
BirthDate DATE,
AnnualSalary MONEY
);
-- Populate table
INSERT TestDatabase.dbo.myWidechar
VALUES (1, N'ϴAnthony', N'Grosse', '02-23-1980', 65000.00),
(2, N'❤Alica', N'Fatnowna', '11-14-1963', 45000.00),
(3, N'☎Stella', N'Rossenhain', '03-02-1992', 120000.00);
-- Review data
SELECT * FROM TestDatabase.dbo.myWidechar;
非 XML 格式檔案範例
SQL Server 支援兩種類型的格式檔案:非 XML 格式和 XML 格式。 非 XML 格式是舊版 SQL Server 所支援的原始格式。 如需詳細資訊,請參閱使用非 XML 格式檔案 (SQL Server)。
下列命令會使用 bcp 公用程式,根據的myWidechar.fmt
架構產生非 XML 格式檔案myWidechar
。 使用 bcp 命令建立格式檔案時,請指定 format
引數並使用 nul
而不是資料檔案路徑。 格式選項也需要 -f
選項。 此外,在此範例中,限定符 c
是用來指定字元數據,而 T
則用來使用整合式安全性來指定信任的連接。 請在命令提示字元之下,輸入下列命令:
bcp TestDatabase.dbo.myWidechar format nul -f D:\BCP\myWidechar.fmt -T -w
REM Review file
Notepad D:\BCP\myWidechar.fmt
重要
請確認您的非 XML 格式檔案以歸位字元\換行字元結尾。 否則,您可能會收到下列錯誤訊息:
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file
範例
下列範例會使用資料庫,以及先前建立的格式檔案。
使用 bcp 和 Unicode 字元格式匯出數據
-w
開關和 OUT
命令。 在此範例中建立的數據檔會用於所有後續範例中。 請在命令提示字元之下,輸入下列命令:
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w
REM Review results
NOTEPAD D:\BCP\myWidechar.bcp
使用 bcp 和 Unicode 字元格式匯入不含格式檔案的數據
-w
開關和 IN
命令。 請在命令提示字元之下,輸入下列命令:
REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"
REM Import data
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -T -w
REM Review results is SSMS
使用 bcp 和 Unicode 字元格式匯入具有非 XML 格式檔案的數據
-w
和 -f
參數和 IN
命令。 需要使用因應措施,因為此範例牽涉到 bcp、格式檔案、Unicode 字元,以及數據檔中的第一個數據欄位是非字元。 請參閱本文稍早 使用 Unicode 字元格式、bcp 和格式檔案的特殊考慮 。 藉由新增額外的記錄做為「虛擬」記錄,然後透過 myWidechar.bcp
參數略過,即可改變數據檔-F 2
。
在命令提示字元中輸入下列命令,然後執行修改步驟︰
REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"
REM Open data file
Notepad D:\BCP\myWidechar.bcp
REM Copy first record and then paste as new first record. This additional record is the "dummy" record.
REM Close file.
REM Import data instructing bcp to skip dummy record with the -F 2 switch.
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -f D:\BCP\myWidechar.fmt -T -F 2
REM Review results is SSMS
REM Return data file to original state for usage in other examples
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w
使用 BULK INSERT 和 Unicode 字元格式而無需使用格式檔案
DATAFILETYPE
論點。 在 Microsoft SQL Server Management Studio (SSMS) 中執行下列 Transact-SQL:
TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar FROM 'D:\BCP\myWidechar.bcp'
WITH (DATAFILETYPE = 'widechar');
-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;
搭配非 XML 格式檔案使用 BULK INSERT 和 Unicode 字元格式
FORMATFILE
論點。 在 Microsoft SQL Server Management Studio (SSMS) 中執行下列 Transact-SQL:
TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar FROM 'D:\BCP\myWidechar.bcp'
WITH (FORMATFILE = 'D:\BCP\myWidechar.fmt');
-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;
使用 OPENROWSET 及 Unicode 字元格式搭配非 XML 格式檔案
FORMATFILE
論點。 在 Microsoft SQL Server Management Studio (SSMS) 中執行下列 Transact-SQL:
TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
INSERT INTO TestDatabase.dbo.myWidechar
SELECT * FROM OPENROWSET (
BULK 'D:\BCP\myWidechar.bcp',
FORMATFILE = 'D:\BCP\myWidechar.fmt'
) AS t1;
-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;
相關工作
若要使用大量匯入或大量匯出的資料格式
- 從舊版 SQL Server 匯入原生和字元格式數據
- 使用字元格式匯入或匯出資料 (SQL Server)
- 使用原生格式匯入或匯出資料 (SQL Server)
- 使用 Unicode 原生格式匯入或匯出資料 (SQL Server)