共用方式為


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

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

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

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

  • 如果來源和目的地數據不是 Unicode 資料類型,則使用 Unicode 字元格式可將源數據中無法表示的擴充字元遺失降到最低。

使用 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 字元格式的命令選項

您可以使用 bcpBULK INSERTOPENROWSET,將 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;

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