将XML批量导入现有表

时间:2014-10-10 16:54:27

标签: sql-server xml

我是XML和SQL Server的新手,我正在尝试将XML文件导入SQL Server 2010.我有14个表,我想将数据解析成。所有14个表名都在XML中列为节点(我认为)我发现了一些使用简单示例XML的示例代码,但我的XML似乎有点复杂,可能没有最佳结构;不幸的是,我无法改变这一点。作为基本尝试,我尝试将数据插入到一个现有表(SILVX_SN16000)的一个字段中,但是“消息”窗格显示“(0行(s)受影响)。提前感谢您查看此内容。

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>

1 个答案:

答案 0 :(得分:0)

.nodes()中的xPath必须指定Row节点的完整路径,因此您应该从SilvxInSightImport开始,一直向下Row

/SilvxInSightImport/Tables/Table/TableData/Row

在您的情况下,您有多个表节点,每个表一个,我假设您一次只需要一个表。您可以在.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