共用方式為


XML 大量載入簡介 (SQLXML 4.0)

適用於:SQL ServerAzure SQL Database

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 資料來源產生適當的記錄 () ,然後將記錄 (s) 傳送至插入SQL Server。

例如,下列來源 XML 檔包含< Customer >元素和< Order >子項目:

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

當 XML 大量載入讀取< Customer >元素時,它會產生 Customertable 的記錄。 當它讀取< /Customer >結束標記時,XML 大量載入會將該記錄插入資料表中的 SQL Server。 同樣地,當它讀取< Order >元素時,XML 大量載入會產生 Ordertable 的記錄,然後在讀取< /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 無法與 Transaction 屬性設定為 FALSE 搭配使用。 ConnectionObject 不支援非交易模式,因為無法在傳入的會話上開啟多個 IRowsetFastLoad 介面。