在不同的定序間複製資料

在 Microsoft SQL Server 中,資料可以在 Unicode 資料行之間平順地移動,而不需要轉換。但是,在包含非 Unicode 字元資料的資料行之間移動的資料,則必須從來源字碼頁轉換為目標字碼頁。「字碼頁」是所給定指令碼的已排序字元集,其中的數值索引 (或字碼指標值) 與每個字元相關聯。字碼頁支援不同 Microsoft Windows 地區設定使用的字元集和鍵盤配置。如需支援的字碼頁清單,請參閱<字碼頁架構>。

根據預設,會使用下列方法轉換字元資料:

作業

字元資料轉換為:

匯出

OEM 字碼頁字元

匯入

ANSI/Microsoft Windows 字碼頁字元

OEM 和 ANSI 字碼頁之間的轉換會造成擴充字元或雙位元組字集 (DBCS) 字元的遺失。若要避免 SQL Server 中的這類轉換,您可以指定字碼頁或定序。

[!附註]

如需有關將資料庫從一個定序傳送到另一個定序的詳細資訊,請參閱此 Microsoft 網站

在 SQL Server 7.0 及更新的版本中,定序可控制字元字串的實體儲存。可支援在四個層級設定定序:伺服器執行個體、資料庫、資料表資料行和運算式。定序會指定三個屬性:

  • 儲存非 Unicode 字元資料所用的字碼頁。

  • 用於 Unicode 資料類型 (ncharnvarcharntext) 的排序順序。排序順序會定義排序字元的順序,以及定義在比較作業中評估字元的方法。

  • 用於非 Unicode 字元資料類型 (char、varchar 和 text) 的排序順序。

[!附註]

Microsoft 建議您在格式檔案中,針對每一個資料行各指定一個定序名稱。

如需字碼頁和定序的簡介,請參閱<定序和 Unicode 支援>。如需詳細資訊,請參閱<使用定序>。

使用資料行層級定序

在 SQL Server 7.0 和更新的版本中,您可以控制資料的轉換,方法是指定目標資料檔欄位中儲存資料的定序 (適用於大量匯出),或指定目標資料表資料行儲存資料的定序 (適用於大量匯入作業)。資料檔定序和資料庫中資料表資料行定序之間所有必要的翻譯,是由匯入或匯出作業在內部執行。

[!附註]

若為 SQL Server 7.0 和更新的版本,可支援指定字碼頁,但比較偏好在格式檔案中指定定序。

在大量匯入和大量匯出作業中,定序一定會套用到 SQLCHAR 資料行。對於未將 SQLCHAR 或 SQLNCHAR 指定為主資料類型的資料行,其資料行定序規格將永遠略過。定序可用來在大量匯入作業期間判斷 SQLCHAR 和 SQLNCHAR 資料行的排序順序,而 ORDER 提示中會參考這些資料行。

若要指定定序,您必須使用格式檔案。這兩種格式檔案類型都支援資料行層級定序。如需在非 XML 格式檔案中使用定序的詳細資訊,請參閱下節<在非 XML 格式檔案中指定資料行層級定序>。如需在 XML 格式檔案中使用定序的詳細資訊,請參閱<瞭解 XML 格式檔案>。

在非 XML 格式檔案中指定資料行層級定序

非 XML 格式檔案中的最後一個資料行 (序數位置為 8 的資料行) 包含的定序規格,可定義該資料行的資料儲存在資料檔中的方法。定序資料行選項如下所示:

選項

描述

name

指定用來將資料儲存在資料檔的定序名稱。如需 SQL 定序名稱的清單,請參閱<SQL Server 定序名稱 (Transact-SQL)>。

RAW

指定將資料儲存在使用命令中的字碼頁選項所指定的字碼頁中,或者 bcp_control BCPFILECP 提示指定的字碼頁中。若未指定任何一個方式,資料檔的定序就是用戶端電腦的 OEM 字碼頁定序。

附註附註
如需字碼頁選項的詳細資訊,請參閱本主題稍後的「使用字碼頁」。如需詳細資訊,請參閱關於 BCPFILECP 的提示,見<bcp_control>。

""

所代表的意義與 RAW 相同。

範例

下列範例示範具有對欄位 2 和欄位 3 指定之資料行定序的非 XML 格式檔案。定序資訊會以粗體來顯示。

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""

[!附註]

前一個格式檔案適用於 AdventureWorks2008R2 範例資料庫的 HumanResources.Department 資料表,其中具有四個資料行:DepartmentIDNameGroupNameModifiedDate

如需有關非 XML 格式檔案的詳細資訊,請參閱<了解非 XML 格式檔案>。

使用字碼頁

[!附註]

若要控制資料轉換,Microsoft 建議您使用格式檔案,對大量匯出或大量匯入作業指定資料行層級定序。如需詳細資訊,請參閱前一節的<使用資料行層級定序>。

指定字碼頁的語法如下:

  • 若要在 bcp 命令中指定字碼頁,請使用 -C 參數:

    -C { ACP | OEM | RAW | code_page }

  • 若要在 BULK INSERT 或 INSERT ... SELECT * FROM OPENROWSET(BULK...) 陳述式中指定字碼頁,請使用 CODEPAGE 選項:

    CODEPAGE = { **'**ACP '| **'**OEM '| **'**RAW '| 'code_page' }

-C 參數和 CODEPAGE 選項都接受下列字碼頁值。

字碼頁值

描述

ACP

匯入作業期間,指定 charvarchartext 資料類型的資料欄位,從 ANSI/Windows 字碼頁 (ISO 1252) 轉換為 SQL Server 字碼頁。

匯出作業期間,指定 bcp 會將這些資料行從 SQL Server 字碼頁轉換為 ANSI/Windows 字碼頁。

OEM(default)

匯入作業期間,指定 charvarchartext 資料類型的資料欄位,從系統 OEM 字碼頁轉換為 SQL Server 字碼頁。

匯出作業期間,指定 bcp 會將這些資料行從 SQL Server 字碼頁轉換為系統 OEM 字碼頁。

RAW

不會將字碼頁轉換成另一種字碼頁。這是最快的選項。

code_page

特定字碼頁編號 (例如,850)。如需支援的字碼頁清單,請參閱<字碼頁架構>。

範例

下列範例會使用 AdventureWorks2008R2 資料庫中的 HumanResources.myTeam 資料表。您必須先建立這個資料表,才能執行範例。如需有關資料表及如何建立資料表的資訊,請參閱<建立 HumanResources.myTeam 資料表>。

[!附註]

測試下列範例之前,應該從 myTeam 資料表刪除現有的資料列,以避免主索引鍵衝突。

A. 使用字碼頁搭配 bcp

這個範例會使用 bcp 將資料從 AdventureWorks2008R2資料庫中的 HumanResources.myTeam資料表大量匯出到 myTeam850.txt 資料檔 (使用字碼頁 850)。在 Windows 命令提示字元中,輸入:

bcp AdventureWorks2008R2.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. 使用字碼頁搭配 BULK INSERT

這個範例會使用 BULK INSERT,將 myTeam850.txt (在之前的 bcp 範例中所建立) 大量匯入至 AdventureWorks2008R2HumanResources.myTeam 資料表。

從查詢工具 (例如 SQL Server Management Studio 查詢編輯器) 執行:

USE AdventureWorks2008R2;
GO
DELETE HumanResources.myTeam;
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

在不同定序之間大量匯出資料

在大量匯出作業中,定序規格會控制用來在資料檔中儲存字元資料的字碼頁。它可套用至:

  • 字元格式資料檔中的所有資料行。

  • 將 SQLCHAR 指定成主檔案資料類型的原生模式檔中的任何資料行。

  • 其值大於 127 或小於 32 的 SQLCHAR 字元。

    定序會套用至值為 32 到 127 的字元,但所有字碼頁會將相同的字元對應至 32 到 127 的值,因此套用不同的定序會沒有作用。

判斷在大量匯出作業上使用何種定序或字碼頁的規則如下:

  • 如果是在格式檔案中或使用 ODBC bcp_setcolfmt 函數 (<bcp_setcolfmt>) 指定資料行定序,則會使用與定序相關聯的 ANSI 字碼頁來儲存字元資料。

  • 如果未指定資料行定序,但已由命令 (或 bcp_control BCPFILECP 提示) 中的字碼頁選項指定了字碼頁,則會使用此指定的字碼頁,來儲存沒有資料行定序規格之資料行的所有 SQLCHAR 資料。

    [!附註]

    如需字碼頁選項的詳細資訊,請參閱本主題稍早的<使用字碼頁>。如需詳細資訊,請參閱關於 BCPFILECP 的提示,見<bcp_control>。

  • 如果您沒有指定定序或字碼頁,會使用用戶端電腦的 OEM 字碼頁儲存 SQLCHAR 資料。

[!附註]

資料檔中沒有儲存定序/字碼頁的任何資訊。

在不同定序之間大量匯入資料

對於大量匯入作業,字碼頁解譯會套用到在資料檔中以 SQLCHAR 字元格式資料來儲存的資料行。在字元格式資料檔中,所有資料行都會儲存為 SQLCHAR。由於資料檔中沒有儲存定序/字碼頁的任何資訊,您必須針對大量匯入作業提供資料欄位之定序/字碼頁的相關資訊。

判斷在大量匯入作業上使用何種定序或字碼頁的規則如下:

  • 如果是在格式檔案中或使用 bcp_setcolfmt 函數 (bcp_setcolfmt) 指定資料行定序,則會使用與指定之資料行定序相關聯的 ANSI 字碼頁,解譯資料檔中的 SQLCHAR 資料。請確定您的定序規格符合資料檔中的定序。

  • 如果未指定資料行定序,但已使用命令或 bcp_control BCPFILECP 提示中的字碼頁選項指定字碼頁,則會使用指定的字碼頁解譯 SQLCHAR 資料。

    [!附註]

    如需字碼頁選項的詳細資訊,請參閱本主題稍早的<使用字碼頁>。如需詳細資訊,請參閱關於 BCPFILECP 的提示,見<bcp_control>。

  • 如果您沒有指定定序或字碼頁,則會使用用戶端電腦的 OEM 字碼頁解譯 SQLCHAR 資料行中的資料。

在大量匯入作業中,定序規格可以控制下列項目:

  • 作業嘗試解譯資料檔中 SQLCHAR 資料行的字碼頁之方法。

  • bcp 或 BULK INSERT 套用至 ORDER 提示的方法 (如果有指定)。

    如果使用 ORDER 提示,大量匯入作業會使用定序適當地解譯 ORDER 提示。這個提示可套用至 SQLCHAR 與 SQLNCHAR 資料行。ORDER 提示所參考之資料行中的資料,必須以對應到這些資料行之定序所定義的順序來排序。如需詳細資訊,請參閱<控制大量匯入資料時的排序順序>。