簡體   English   中英

從XML RAW數據批量插入SQL Server 2008 R2

[英]Bulk insert into SQL Server 2008 R2 from XML RAW data

我有一個如下的XML結構:

<tables>
  <table name="tableName1">
    <row ID="34" col1="data" col2="dom" />
    <row ID="35" col1="data2" col2="dom2" />
  </table>
  <table name="tableName2">
    <row ID="1" col1="data" col2="dom" col3="item1" />
    <row ID="3" col1="data2" col2="dom2" col3="item2" />
    <row ID="7" col1="data4" col3="item3" />
  </table>
  ...
<tables>

基本上,表節點包含通過選擇FOR XML RAW創建的RAW數據。

現在,我想做相反的事情:讀取XML並將數據插入到SQL Server 2008 R2數據庫的各個表中。 但是,我希望加載過程要健壯,這意味着我不想在將來更改列名和表名時弄亂它們。 我需要從表節點的@name屬性讀取表名稱並將數據插入到<Row>節點中的屬性指定的<Row>中的過程。 我想到了一個存儲過程,該存儲過程將XML作為輸入並執行其余操作。

數據量約為 70個表,范圍從10到30,000行,總共不超過10萬行。 我需要盡可能高效地執行此操作,批量加載將是最好的。

該過程不應該處理外鍵,因為XML內部的表順序是建立的,因此可以通過在一個表之后再加載另一個表來保持FK約束。

但是,每個表中都有標識列,因此我必須做一個

SET Identity_Insert ON and SET Identity_Insert OFF

處理每個表之前和之后。 插入所有行后,我還需要重新設置每個表的種子。 哦,我需要進行整個交易,以便在出現問題時回退。

您建議我采用哪種方式:我應該繼續使用T-SQL還是嘗試用CLR SQL編寫SP? 我應該使用XQuery還是可以使用一些批量插入方法?

感謝您的所有幫助!

基本上,您將必須遍歷XML並根據結果集編寫查詢。

試試這個開始:

declare @i int;
declare @x xml;

------
SELECT @x = N'
<tables>
  <table name="tableName1">
    <row ID="34" col1="data" col2="dom" />
    <row ID="35" col1="data2" col2="dom2" />
  </table>
  <table name="tableName2">
    <row ID="1" col1="data" col2="dom" col3="item1" />
    <row ID="3" col1="data2" col2="dom2" col3="item2" />
    <row ID="7" col1="data4" col3="item3" />
  </table>
</tables>';


exec sp_xml_preparedocument @i output, @x


select ID, col1, col2
from OpenXml(@i, '/tables/table/row')
with (ID int, col1 nvarchar(30), col2 nvarchar(30))

exec sp_xml_removedocument @i

它將為您提供插入數據所需的列的列表(您可以在上一級獲得表名稱之前,只需更改SQL)

34  data    dom
35  data2   dom2
1   data    dom
3   data2   dom2
7   data4   NULL

接下來,您需要在此結果集上編寫循環的語句。

僅供參考,您無需編寫XML,可以從如下文件中讀取:

SELECT @x = xCol.BulkColumn FROM OPENROWSET (BULK 'c:\Update.xml', SINGLE_BLOB) AS xCol;

當您處理相當大的XML文檔時,我建議此時使用.net碎紙機。 您可以在CLR過程或外部工具中執行此操作。 您也可以使用SQL Server的xquery構建,但這會很慢。

但是,考慮到這個問題和您以前的問題(將數據從MS SQL Server 2008 R2轉儲到單個XML文件中 ),我認為您最好使用BCP實用程序甚至復制。 您的確切要求是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM