如何将XML文件插入SQL表

时间:2017-01-27 15:17:43

标签: sql sql-server xml

如何将其插入SQL表?

<ITEM id="1" 
    name="Swimmer Head" 
    mesh_name="eq_head_swim" 
    totalpoint="0" 
    type="equip" 
    res_sex="m" 
    res_level="0" 
    slot="head" 
    weight="2" 
    bt_price="0" 
    hp="4" 
    ap="8" 
    maxwt="0" 
    sf="0" 
    fr="0" 
    cr="0" 
    pr="0" 
    lr="0" 
    color="#FFFFFFFF" 
    desc="Part of an everyday swimming outfit" />

此外,此XML文件中还有很多行,那么如何使用1 .sql文件执行此操作?

2 个答案:

答案 0 :(得分:3)

这是一种方法,它将为您提供EAV结构(实体属性值)。

您可能会注意到我只需识别一个关键元素... id

我截断了一些元素并添加了第二项仅用于演示目的

Declare @XML xml = '
<ITEM id="1" name="Swimmer Head" mesh_name="eq_head_swim" totalpoint="0" type="equip" res_sex="m" res_level="0" slot="head" weight="2" bt_price="0" color="#FFFFFFFF" desc="Part of an everyday swimming outfit" />
<ITEM id="2" name="Boxer Feet" mesh_name="eq_feet_boxer" totalpoint="0" type="equip" res_sex="m" res_level="0" slot="head" weight="2" bt_price="25.00" color="#FFFFFFFF" desc="Somthing for the boxer" />
'

Select ID     = r.value('@id','int')
      ,Item   = attr.value('local-name(.)','varchar(100)')
      ,Value  = attr.value('.','varchar(max)') 
 From  @XML.nodes('/ITEM') as A(r)
 Cross Apply A.r.nodes('./@*') AS B(attr)
 Where attr.value('local-name(.)','varchar(100)') not in ('id')

退货(必要时可以很容易地转动)

enter image description here

  

编辑 - 从文件加载XML

Declare @XML xml
Select @XML = BulkColumn FROM  OPENROWSET(BULK 'C:\Working\SomeXMLFile.xml', SINGLE_BLOB) x;

Select ID     = r.value('@id','int')
      ,Item   = attr.value('local-name(.)','varchar(100)')
      ,Value  = attr.value('.','varchar(max)') 
 From  @XML.nodes('/ITEM') as A(r)
 Cross Apply A.r.nodes('./@*') AS B(attr)
 Where attr.value('local-name(.)','varchar(100)') not in ('id')

答案 1 :(得分:0)

重新询问Siyual的问题,但更具体:

这一行中有哪一行应该进入表格吗?

它不是嵌套的吗?

换句话说,它会继续重复<ITEM id= [...] desc="something" />吗?如果答案是肯定的,请考虑一个perl脚本,它在等号之后选取所有内容,并在双引号之间并连接获得的位,用逗号分隔它们,每<ITEM [...] />创建一行。

这样,您就可以获得要加载的CSV文件。当然,您必须先创建目标表。