[英]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.