使用 Unicode 字元格式匯入或匯出資料 (SQL Server)

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

使用含有擴充/DBCS 字元的資料檔案在多個 SQL Server 執行個體之間大量傳送資料時,建議使用 Unicode 字元格式。 Unicode 字元資料格式可允許從伺服器匯出資料時所使用的字碼頁,與執行作業之用戶端所使用的字碼頁不同。 在此情況下,使用 Unicode 字元格式具有下列優點:

  • 如果來源資料和目的地資料都是 Unicode 資料類型,使用 Unicode 字元格式可保留所有的字元資料。

  • 若來源資料及目的地資料不是 Unicode 資料類型,則使用 Unicode 字元格式有助於將遺失來源資料中,目的地無法呈現之擴充字元的可能性降至最低。

本主題內容:
使用 Unicode 字元格式的注意事項
使用 Unicode 字元格式、bcp 與格式檔案的特殊注意事項
Unicode 字元格式的命令選項
範例測試條件
 ● 範例資料表
 ● 非 XML 格式檔案範例
範例
 ● 使用 bcp 與 Unicode 字元格式匯出資料
 ● 不使用格式檔案而使用 bcp 與 Unicode 字元格式匯入資料
 ● 使用 bcp 與 Unicode 字元格式匯入非 XML 格式檔案的資料
 ● 不使用格式檔案而使用 BULK INSERT 與 Unicode 字元格式
 ● 搭配非 XML 格式檔案使用 BULK INSERT 與 Unicode 字元格式
 ● 搭配非 XML 格式檔案使用 OPENROWSET 與 Unicode 字元格式
相關工作

使用 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 字元。

  • 使用了格式檔案。

  • 資料檔案中的第一個欄位不是字元。

請考慮下列因應措施是否適用於 情況︰

Unicode 字元格式的命令選項

您可以將 Unicode 字元格式資料匯入資料表,方法是使用 bcpBULK INSERTINSERT ...SELECT * FROM OPENROWSET(BULK...)。對於 bcp 命令或 BULK INSERT 陳述式,您可以在陳述式中指定資料格式。 對於 INSERT...SELECT * FROM OPENROWSET(BULK...) 陳述式,您必須在格式檔案中指定資料格式。

下列命令列選項支援 Unicode 字元格式:

Command 選項 描述
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 取代資料檔案路徑。 format 選項也需要 -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 會因為額外新增一筆 "dummy" 記錄而有所改變。-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;

對非 XML 格式檔案使用 OPENROWSET 與 Unicode 字元格式

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;

若要使用大量匯入或大量匯出的資料格式

另請參閱

bcp 公用程式
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
資料類型 (Transact-SQL)
定序與 Unicode 支援