共用方式為


XML 大量載入簡介 (SQLXML 4.0)

XML 大量載入是獨立的 COM 物件,可讓您將半結構化的 XML 資料載入至 Microsoft SQL Server 資料表。

您可以使用 INSERT 陳述式和 OPENXML 函數將 XML 資料插入至 SQL Server 資料庫,不過當您需要插入大量的 XML 資料時,大量載入公用程式可以提供較佳的效能。

XML 大量載入物件模型的 Execute 方法採用兩個參數:

  • 註解 XML 結構描述定義 (XSD) 或 XML 資料精簡 (XDR) 結構描述。XML 大量載入公用程式在識別其中將插入 XML 資料的 SQL Server 資料表時,會解譯此對應結構描述以及結構描述中所指定的註解。

  • XML 文件或文件片段 (文件片段是沒有單一最上層元素的文件)。可以指定 XML 大量載入能從中讀取的檔案名稱或資料流。

XML 大量載入會解譯對應結構描述並識別其中將插入 XML 資料的資料表。

這裡假設您熟悉下列的 SQL Server 功能:

XML 資料的資料流

因為來源 XML 文件可能很大,所以不會將整個文件讀入記憶體來進行大量載入處理,而是由 XML 大量載入以資料流的方式解譯 XML 資料,再加以讀取。此公用程式讀取資料時會識別資料庫資料表,從 XML 資料來源產生適當的記錄,然後再將記錄傳送到 SQL Server 進行插入。

例如,下列的來源 XML 文件是由 <Customer> 元素和 <Order> 子元素組成:

<Customer ...>
    <Order.../>
    <Order .../>
     ...
</Customer>
...

當 XML 大量載入讀取 <Customer> 元素時,會針對 Customer資料表產生記錄。當 XML 大量載入讀取 </Customer> 結束標記時,會將該記錄插入至 SQL Server 中的資料表。同樣地,當 XML 大量載入讀取 <Order> 元素時,也會為 Order資料表產生記錄,然後在讀取 </Order> 結束標記時,將該記錄插入至 SQL Server 資料表。

交易和非交易 XML 大量載入作業

XML 大量載入可以在交易或非交易模式中操作。如果以非交易模式進行大量載入,通常效能會最佳化:也就是 Transaction 屬性是設定為 FALSE 而下列其中一個條件為真:

  • 其中要大量載入資料的資料表是空的,且沒有任何索引。

  • 資料表具有資料和唯一的索引。

非交易的方法並不保證能在大量載入程序發生問題時進行回復 (雖然可能可以進行部分回復)。當資料表是空白時,適用非交易的大量載入。因此在發生問題時,您可以清除資料庫,然後再次啟動 XML 大量載入。

[!附註]

在非交易模式中,XML 大量載入會使用預設的內部交易並加以認可。當 Transaction 屬性設定為 TRUE 時,XML 大量載入並不會在此交易上呼叫認可。

如果 Transaction 屬性設定為 TRUE,則 XML 大量載入會針對在對應結構描述中所識別的每個資料表建立一個暫存檔。XML 大量載入會先把來自來源 XML 文件的記錄儲存在這些暫存檔中。接著 Transact-SQL BULK INSERT 陳述式會從檔案擷取這些記錄,然後將它們儲存在對應的資料表中。您可以使用 TempFilePath 屬性來指定這些暫存檔的位置。您必須確定用於 XML 大量載入的 SQL Server 帳戶具有這個路徑的存取權。如果沒有指定 TempFilePath 屬性,則在 TEMP 環境變數中指定的預設檔案路徑會用來建立暫存檔。

如果 Transaction 屬性設定為 FALSE (預設設定),則 XML 大量載入會使用 OLE DB 介面 IRowsetFastLoad 大量載入資料。

如果 ConnectionString 屬性設定連接字串,而 Transaction 屬性設定為 TRUE,XML 大量載入就會以其本身的交易內容操作 (例如,XML 大量載入會啟動本身的交易,然後依需要進行認可或回復)。

如果 ConnectionCommand 屬性以現有的連接物件設定連接,而 Transaction 屬性設定為 TRUE,XML 大量載入就不會在成功或失敗時分別發出 COMMIT 或 ROLLBACK 陳述式。如果發生錯誤,XML 大量載入會傳回適當的錯誤訊息。至於是否要發出 COMMIT 或 ROLLBACK 陳述式,則會留給起始大量載入的用戶端決定。用於 XML 大量載入的連接物件應該為 ICommand 類型或 ADO 命令物件。

在 SQLXML 4.0 中,ConnectionObject 不能與設定為 FALSE 的 Transaction 屬性搭配使用。ConnectionObject 不支援非交易模式,因為在傳入的工作階段上不能開啟一個以上的 IRowsetFastLoad 介面。