2014-10-10 68 views
1

我是XML和SQL Server的新手,並試圖將XML文件導入到SQL Server 2010中。我有14個表,我想將這些數據解析爲數據。所有14個表名在XML中都列爲節點(我認爲)我發現了一些可以與簡單示例XML一起工作的示例代碼,但是我的XML看起來更復雜一些,可能不是最佳結構;不幸的是,我無法改變這一點。作爲基本嘗試,我嘗試將數據插入到一個現有表的一個字段(SILVX_SN16000)中,但消息窗格顯示「(0行(s)affected affected。)預先感謝您看到此內容將XML導入到現有表中批量導入

USE TEST 
Declare @xml XML 

Select @xml = 
CONVERT(XML,bulkcolumn,2) FROM OPENROWSET(BULK 'C:\Users\Kevin_S\Documents   \SilvxInSightImport.xml',SINGLE_BLOB) AS X 

SET ARITHABORT ON 

Insert into [SILVX_SN16000] 
(
md_group 
) 

Select 
P.value('MD_GROUP[1]','NVARCHAR(255)') AS md_group 
From @xml.nodes('/TableData/Row') PropertyFeed(P) 

這裏是我的XML的一個備受縮短(行刪除)版本:

<?xml version="1.0" ?> 
<SilvxInSightImport Version="1.0" Host="uslsss17" Date="14-09-14_20-40-02"> 
<Tables Count="14"> 
<Table Name="SN16000"> 
<TableSchema> 
<Column><COLUMN_NAME>PARENT_HPKEY</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> 
<Column><COLUMN_NAME>MD_GROUP</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> 
<Column><COLUMN_NAME>PKEY</COLUMN_NAME><DATA_TYPE>NUMBER</DATA_TYPE></Column> 
<Column><COLUMN_NAME>S_STATE</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> 
<Column><COLUMN_NAME>NAME</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> 
<Column><COLUMN_NAME>ROUTER_ID</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> 
<Column><COLUMN_NAME>IP_ADDR</COLUMN_NAME><DATA_TYPE>VARCHAR2</DATA_TYPE></Column> 
</TableSchema> 
<TableData> 
<Row><MD_GROUP>100.120.25162</MD_GROUP><PARENT_HPKEY>100</PARENT_HPKEY> <PKEY>161888</PKEY><NAME>UODEDTM010</NAME><ROUTER_ID>10.41.32.129</ROUTER_ID> <IP_ADDR>10.41.32.129</IP_ADDR><S_STATE>IS-NR</S_STATE></Row> 
<Row><MD_GROUP>100.120.25162</MD_GROUP><PARENT_HPKEY>100</PARENT_HPKEY> <PKEY>278599</PKEY><NAME>UODEETM010</NAME><ROUTER_ID>10.41.4.129</ROUTER_ID> <IP_ADDR>10.41.4.129</IP_ADDR><S_STATE>IS-NR</S_STATE></Row> 
<Row><MD_GROUP>100.120.25162</MD_GROUP><PARENT_HPKEY>100</PARENT_HPKEY> <PKEY>183583</PKEY><NAME>UODEGRM010</NAME><ROUTER_ID>10.41.76.129</ROUTER_ID> <IP_ADDR>10.41.76.129</IP_ADDR><S_STATE>IS-NR</S_STATE></Row> 
NT_HPKEY>100</PARENT_HPKEY><PKEY>811003</PKEY><NAME>UODWTIN010</NAME> <ROUTER_ID>10.27.36.130</ROUTER_ID><IP_ADDR>10.27.36.130</IP_ADDR><S_STATE>IS-NR</S_STATE> </Row> 
</TableData> 
</Table> 
</Tables> 
</SilvxInSightImport> 

回答

0

在.nodes()的XPATH必須指定整個路徑節點,所以你應該SilvxInSightImport開始,然後下降到。

​​

在你的情況下,你有多個表節點,每個表一個,我假設你一次只需要一個表。您可以在.nodes()xPath表達式的表名稱中使用謂詞。

/SilvxInSightImport/Tables/Table[@Name = "SN16000"]/TableData/Row 

您的整個查詢SN16000應該看起來像這樣。

select T.X.value('(MD_GROUP/text())[1]', 'varchar(20)') as MD_GROUP, 
     T.X.value('(PARENT_HPKEY/text())[1]', 'int') as PARENT_HPKEY, 
     T.X.value('(PKEY/text())[1]', 'int') as PKEY, 
     T.X.value('(NAME/text())[1]', 'varchar(20)') as NAME, 
     T.X.value('(ROUTER_ID/text())[1]', 'varchar(20)') as ROUTER_ID, 
     T.X.value('(IP_ADDR/text())[1]', 'varchar(20)') as IP_ADDR, 
     T.X.value('(S_STATE/text())[1]', 'varchar(20)') as S_STATE 
from @XML.nodes('/SilvxInSightImport/Tables/Table[@Name = "SN16000"]/TableData/Row') as T(X) 

您必須整理每列使用的數據類型。

SQL Fiddle

+0

非常感謝!這很好。另一件小事:如果我想插入源XML的文件名(可以在XML的第二行的元素中找到),我可以在插入語句中以某種方式包含它嗎?這就是我所說的元素: 2014-10-10 18:33:57

+0

@Kevin_S你希望這個值是'SilvxInSightImport'嗎?如果是這樣,您可以將其作爲常量添加到列列表中,因爲您已經在.nodes()的xPath中將該值作爲常量。如果根節點可以有不同的名稱,可以將xPath更改爲使用通配符「*」代替「SilvxInSightImport」,並使用'local-name()'函數來提取節點名稱。看看[SQL小提琴](http://sqlfiddle.com/#!6/d41d8/22171)。 – 2014-10-10 18:47:23

+0

是的。這樣可行!謝謝! – 2014-10-14 17:06:36