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 |
如需 MicrosoftSQL 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");
}