XML 格式檔案的結構描述語法

本節說明 XML 格式檔案的語法。若要了解語法如何對應到實際 XML 格式檔案,請參閱<範例 XML 格式檔案>。本節也探討大量匯入如何使用 <ROW> 與 <COLUMN> 元素,以及如何將元素的 xsi:type 值放入資料集中。

您可以使用 XML 格式檔案來搭配 bcp 命令、BULK INSERT 陳述式或 INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式。

[!附註]

   您可以修改格式檔案,讓您從欄位數目及/或順序與資料表資料行數目及/或順序不同的資料檔案,進行大量匯入。如需詳細資訊,請參閱<在大量匯入期間使用格式檔案將欄位對應到資料行>。

XML 結構描述的基本語法

此語法陳述式只會顯示元素 (<BCPFORMAT>、<RECORD>、<FIELD>、<ROW> 和 <COLUMN>) 及其基本屬性。

<BCPFORMAT ...>

   <RECORD>

      <FIELD ID = "fieldID" xsi:type = "fieldType" [...]

      />

   </RECORD>

   <ROW>

      <COLUMN SOURCE = "fieldID" NAME = "columnName" xsi:type = "columnType" [...]

      />

   </ROW>

</BCPFORMAT>

[!附註]

本主題稍後將會描述與 <FIELD> 或 <COLUMN> 元素中的 xsi:type 值相關聯的其他屬性。

結構描述元素的描述

本節摘要說明 XML 結構描述為 XML 格式檔案定義之每個元素的目的。稍後會在此主題另一節說明屬性。

  • <BCPFORMAT>
    格式檔案元素,它定義所指定資料檔的記錄結構,以及它和資料表中資料表資料列的資料行之對應關係。

  • <RECORD .../>
    定義包含一或多個 <FIELD> 元素的複雜元素。格式檔案中欄位的宣告順序是欄位出現在資料檔中的順序。

  • <FIELD .../>
    定義資料檔中包含資料的欄位。

    這個元素的屬性將在本主題稍後的「<FIELD> 元素的屬性」中加以討論。

  • <ROW .../>
    定義包含一或多個 <COLUMN> 元素的複雜元素。<COLUMN> 元素的順序與 RECORD 定義中的 <FIELD> 元素順序無關。相反的,格式檔案中的 <COLUMN> 元素順序會決定結果資料列集中的資料行順序。資料欄位會以對應的 <COLUMN> 元素在 <COLUMN> 元素中宣告的順序載入。

    如需詳細資訊,請參閱本主題稍後的「大量匯入如何使用 <ROW> 元素」。

  • <COLUMN>
    定義資料行做為元素 (<COLUMN>)。每個 <COLUMN> 元素都會對應到 <FIELD> 元素 (其識別碼是在 <COLUMN> 元素的 SOURCE 屬性中指定)。

    此元素的屬性將在本主題稍後的「<COLUMN> 元素的屬性」中加以討論。此外,亦請參閱本主題稍後的「大量匯入如何使用 <COLUMN> 元素」。

  • </BCPFORMAT>
    結束格式檔案時需要用到。

<FIELD> 元素的屬性

本節描述 <FIELD> 元素的屬性,這些屬性會摘要在下列的結構描述語法中:

<FIELD

   ID ="fieldID"

   xsi**:**type ="fieldType"

   [ LENGTH ="n" ]

   [ PREFIX_LENGTH ="p" ]

   [ MAX_LENGTH ="m" ]

   [ COLLATION ="collationName" ]

   [ TERMINATOR ="terminator" ]

/>

每個 <FIELD> 元素都與其他元素無關。以下透過屬性來說明欄位:

FIELD 屬性

說明

選擇性 /

必要

ID ="fieldID"

指定資料檔中欄位的邏輯名稱。欄位識別碼是用來參考該欄位的索引鍵。

<FIELD ID="fieldID"/> 對應到 <COLUMN SOURCE="fieldID"/>

必要

xsi:type ="fieldType"

這是識別元素執行個體之類型的 XML 建構 (如同屬性般使用)。fieldType 的值會決定在給定的執行個體中需要哪些選用屬性 (如下)。

必要 (視資料類型而定)

LENGTH ="n"

此屬性定義固定長度資料類型的執行個體之長度。

n 的值必須為正整數。

除非 xsi:type 值有要求,否則是選擇性的

PREFIX_LENGTH ="p"

此屬性定義二進位資料代表的前置長度。PREFIX_LENGTH 值 p 必須是下列其中一個:1、2、4 或 8。

除非 xsi:type 值有要求,否則是選擇性的

MAX_LENGTH ="m"

此屬性是可儲存在給定欄位中的最大位元組數。若沒有目標資料表,則無法取得資料行最大長度。MAX_LENGTH 屬性會限制輸出字元資料行的最大長度,因而限制為資料行值配置的儲存區。在 ELECT FROM 子句中使用 OPENROWSET 函數的 BULK 選項時,這樣做特別方便。

m 的值必須為正整數。根據預設,char 資料行的最大長度是 8000 個字元,而 nchar 資料行的最大長度是 4000 個字元。

選擇性

COLLATION ="collationName"

COLLATION 只能用於字元欄位。如需 SQL 定序名稱的清單,請參閱<SQL Server 定序名稱 (Transact-SQL)>。

選擇性

TERMINATOR = "terminator"

此屬性會指定資料欄位的結束字元。結束字元可以是任何字元。結束字元必須是不包含於資料之任何部分的唯一字元。

根據預設,欄位結束字元是定位字元 (以 \t 表示)。若要表示段落標記,請使用 \r\n。

只能搭配字元資料的 xsi:type 使用,字元資料需要此屬性。

<FIELD> 元素的 Xsi:type 值

xsi:type 值是識別元素執行個體之資料類型的 XML 建構 (如同屬性般使用)。如需有關使用「將 xsi:type 值放入資料集」的資訊,請參閱本節稍後的部分。

<FIELD> 元素的 Xsi:type 值支援下列資料類型。

<FIELD> xsi:type 值

必要的 XML 屬性

適用於資料類型

選擇性 XML 屬性

適用於資料類型

NativeFixed

LENGTH

無。

NativePrefix

PREFIX_LENGTH

MAX_LENGTH

CharFixed

LENGTH

COLLATION

NCharFixed

LENGTH

COLLATION

CharPrefix

PREFIX_LENGTH

MAX_LENGTH、COLLATION

NCharPrefix

PREFIX_LENGTH

MAX_LENGTH、COLLATION

CharTerm

TERMINATOR

MAX_LENGTH、COLLATION

NCharTerm

TERMINATOR

MAX_LENGTH、COLLATION

如需 Microsoft SQL Server 資料類型的詳細資訊,請參閱<資料類型 (Transact-SQL)>。

<COLUMN> 元素的屬性

本節描述 <COLUMN> 元素的屬性,這些屬性會摘要在下列的結構描述語法中:

<COLUMN

   SOURCE = "fieldID"

   NAME = "columnName"

   xsi:type = "columnType"

   [ LENGTH = "n" ]

   [ PRECISION = "n" ]

   [ SCALE = "value" ]

   [ NULLABLE = { "YES"

"NO" } ]

/>

欄位會使用下列屬性對應到目標資料表的資料行:

COLUMN 屬性

說明

選擇性 /

必要

SOURCE ="fieldID"

指定對應到資料行的欄位識別碼。

<COLUMN SOURCE="fieldID"/> 對應到 <FIELD ID="fieldID"/>

必要

NAME = "columnName"

指定資料列集中由格式檔案代表的資料行名稱。此資料行名稱會用來識別結果集中的資料行,而且它不需要對應到用於目標資料表中的資料行名稱。

必要

xsi:type ="ColumnType"

這是識別元素執行個體之資料類型的 XML 建構 (如同屬性般使用)。ColumnType 的值會決定在給定的執行個體中需要哪些選用屬性 (如下)。

附註附註
ColumnType 的可能值與關聯的屬性如下表所示。

選擇性

LENGTH ="n"

定義固定長度資料類型的長度。只有當 xsi:type 是字串資料類型時,才會使用 LENGTH。

n 的值必須為正整數。

選用 (只在 xsi:type 是字串資料類型時才可使用)

PRECISION ="n"

指定數字中的位數。例如,數字 123.45 的精確度是 5。

其值必須為正整數。

選擇性 (唯有 xsi:type 是變數數字 (variable-number) 資料類型時才能使用)

SCALE ="int"

指定數字中小數點右方的位數。例如,數字 123.45 的小數位數是 2。

值必須是整數。

選擇性 (唯有 xsi:type 是變數數字 (variable-number) 資料類型時才能使用)

NULLABLE = { "YES"

"NO" }

指定資料行是否可指定 NULL 值。此屬性完全與 FIELDS 無關。然而,若資料行並非 NULLABLE 且欄位指定 NULL (未指定任何值),則會導致執行階段錯誤。

只有當您執行一般的 SELECT FROM OPENROWSET(BULK...) 陳述式時,才會使用 NULLABLE 屬性。

選擇性 (可用於任何資料類型)

<COLUMN> 元素的 Xsi:type 值

xsi:type 值是識別元素執行個體之資料類型的 XML 建構 (如同屬性般使用)。如需有關使用「將 xsi:type 值放入資料集」的資訊,請參閱本節稍後的部分。

<COLUMN> 元素支援原生 SQL 資料類型,如下所示:

類型類別目錄

<COLUMN> 資料類型

必要的 XML 屬性

適用於資料類型

選擇性 XML 屬性

適用於資料類型

固定

SQLBIT、SQLTINYINT、SQLSMALLINT、SQLINT、SQLBIGINT、SQLFLT4、SQLFLT8、SQLDATETIME、SQLDATETIM4、SQLDATETIM8、SQLMONEY、SQLMONEY4、SQLVARIANT 和 SQLUNIQUEID

無。

NULLABLE

變數數字

SQLDECIMAL 及 SQLNUMERIC

無。

NULLABLE、PRECISION、SCALE

LOB

SQLIMAGE、CharLOB、SQLTEXT 和 SQLUDT

無。

NULLABLE

字元 LOB

SQLNTEXT

無。

NULLABLE

二進位字串

SQLBINARY 及 SQLVARYBIN

無。

NULLABLE、LENGTH

字元字串

SQLCHAR、SQLVARYCHAR、SQLNCHAR 和 SQLNVARCHAR

無。

NULLABLE、LENGTH

重要事項重要事項

若要大量匯出或匯入 SQLXML 資料,請在格式檔案中使用下列資料類型:SQLCHAR 或 SQLVARYCHAR (資料會以用戶端字碼頁或定序所隱含的字碼頁傳送)、SQLNCHAR、SQLNVARCHAR (資料會以 Unicode 傳送)、SQLBINARY 或 SQLVARYBIN (資料不經轉換即傳送)。

如需有關 SQL Server 資料類型的詳細資訊,請參閱<資料類型 (Transact-SQL)>。

大量匯入如何使用 <ROW> 元素

某些內容會忽略 <ROW> 元素。<ROW> 元素是否會影響大量匯入作業,視作業執行方式而定:

  • bcp 命令

    當資料載入目標資料表時,bcp 會略過 <ROW> 元件。相反地,bcp 會根據目標資料表的資料行類型來載入資料。

  • Transact-SQL 陳述式 (BULK INSERT 和 OPENROWSET 的 Bulk 資料列集提供者)

    大量匯入資料到資料表時,Transact-SQL 陳述式會使用 <ROW> 元件來產生輸入資料列集。此外,Transact-SQL 陳述式會根據在目標資料表中 <ROW> 與對應資料行中指定的資料行類型,執行適當的類型轉換。若格式檔案中指定的資料行類型與目標資料表不同,會發生額外的類型轉換。此額外類型轉換可能會導致 BULK INSERT 或 OPENROWSET 的 Bulk 資料列集提供者發生某些不一致 (亦即,遺失精確度) 的行為 (與 bcp 相較)。

    <ROW> 元素中的資訊可讓您建構資料列,而不需要任何額外資訊。因此,您可以使用 SELECT 陳述式 (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile) 來產生資料列集。

    [!附註]

    OPENROWSET BULK 子句需要格式檔案 (請注意,要有 XML 格式檔案才能將欄位的資料類型轉換為資料行的資料類型)。

大量匯入如何使用 <COLUMN> 元素

若要大量匯入資料至資料表中,格式檔案中的 <COLUMN> 元素會藉由指定下列各項,將資料檔案欄位對應到資料表資料:

  • 資料檔的資料列中每一個欄位的位置。

  • 資料行類型,用來將欄位資料類型轉換成所要的資料行資料類型。

若沒有任何資料行對應到欄位,則該欄位不會被複製到產生的資料列。此行為可讓資料檔產生具有不同資料行的資料列 (在不同的資料表中)。

同樣地,從資料表大量匯出資料時,格式檔案中的每一個 <COLUMN> 會將輸入資料表資料列中的資料行對應到輸出資料檔中的對應欄位。

將 xsi:type 值放到資料集中

當您使用 XML Schema Definition (XSD) 語言來驗證 XML 文件時,xsi:type 值不會放到資料集中。然而,您可以透過將 XML 格式檔案載入到 XML 文件 (例如:myDoc),來將 xsi:type 資訊放到資料集中,如以下程式碼片段所示:

...;
myDoc.LoadXml(xmlFormat);
XmlNodeList ColumnList = myDoc.GetElementsByTagName("COLUMN");
for(int i=0;i<ColumnList.Count;i++)
{
   Console.Write("COLUMN: xsi:type=" +ColumnList[i].Attributes["type",
      "http://www.w3.org/2001/XMLSchema-instance"].Value+"\n");
}