共用方式為


XML 大量載入簡介 (SQLXML 4.0)

適用於:SQL Server Azure SQL 資料庫

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

您可以使用 INSERT 語句和 OPENXML 函數,將 XML 數據插入 SQL Server 資料庫中;不過,當您需要插入大量 XML 數據時,大量載入公用程式可提供更佳的效能。

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

  • 批註的 XML 架構定義 (XSD) 或 XML-Data Reduced (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> 元素時,它會產生 Customertable 的記錄。 <讀取 /Customer> 結束標記時,XML 大量載入會將該記錄插入 SQL Server 中的數據表。 同樣地,當它讀取 Order> 元素時,XML 大量載入會產生 Ordertable 的記錄,然後在讀取< /Order> end 標記時,將該記錄插入 SQL Server 數據表中。<

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

XML 大量載入可以在交易或非交易模式中運作。 如果您是以非交易模式大量載入,效能通常是最佳的:也就是說,Transaction 屬性會設定為 FALSE,而下列任一條件為 true:

  • 大量載入數據的數據表是空的,沒有索引。

  • 數據表具有數據和唯一索引。

如果大量載入程式中發生問題,非交易方法並不保證回復(雖然部分回復可能發生)。 當資料庫是空的時,非交易的大量載入是適當的。 因此,如果發生錯誤,您可以清除資料庫並再次啟動 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 介面。