层次结构XML到SQL

时间:2012-11-27 12:24:02

标签: xml sql-server-2008 parsing xml-parsing

我有一个包含多个元素和属性的xml(你可以在下面看到一个例子),我想从中创建一个SQL表/表。

XML示例:

<prgs>
 <prg Id="1" >
   <name>Xulescu</name>
   <type>Human</type>
   <attribs>
     <attrib>doesn't matter</attrib>
   </attribs>
   <timeZone>doesn't matter</timeZone>
   <URL>doesn't matter/</URL>

 .....
</prgs>

我需要制作一个这样的表

ID       |      Name
-------------------------
1        |      Xulescu
......

谢谢

另一种情况

这个怎么样?

<schedules type="tip1">
  <schedule prgsId="15361" >
     <event Id="1234" date="2012-10-05">
       <times>
         <time>01:00</time>
       </times>
     </event>
     <event Id="2345" date="2012-10-05">
       <times>
         <time>01:30</time>
       </times>
     </event>

    

结果应该是一个表

    ID     ScheduleID      PrgsID        showId     Date     Time
  .................................................................
   1        xxx            xxxx          1234     2012-10-05   01:00
   2        xxx            xxxx          2345     2012-10-05   01:30

ID是一个自动增量字段

ScheduleID, PrgsID是FK密钥

1 个答案:

答案 0 :(得分:1)

这样的事情:

DECLARE @XmlFile XML

SELECT @XmlFile = CAST(BulkColumn AS XML)
FROM OPENROWSET (BULK 'C:\temp\sample.xml' , SINGLE_BLOB) AS XMLDATA

SELECT
    ID = Prgs.value('@Id', 'int'),
    Name = Prgs.value('(name)[1]', 'varchar(50)')
FROM 
    @XmlFile.nodes('/prgs/prg') AS XTbl(Prgs)

如果您的文件包含此XML:

<prgs>
 <prg Id="1" >
   <name>Xulescu</name>
   <type>Human</type>
</prg>
 <prg Id="2" >
   <name>Xulescu2</name>
   <type>Human</type>
</prg>
</prgs>

你会得到这个输出:

ID  Name
------------
1   Xulescu
2   Xulescu2

更新:针对您的其他方案 - 这个怎么样? (假设您已在@XML变量中拥有XML结构):

INSERT INTO dbo.YourTable(ScheduleID, PrgsID, ShowId, [Date], [Time])
   SELECT
       Sched.value('@prgsId', 'int'),
       Sched.value('@prgsId', 'int'),
       Events.value('@Id', 'int'),
       Events.value('@date', 'date'),
       Events.value('(times/time)[1]', 'varchar(50)')
   FROM
       @XML.nodes('/schedules/schedule') AS XTbl(Sched)
   CROSS APPLY
       Sched.nodes('event') AS XTbl2(Events)

不确定ScheduleIdPrgsId中您想要的属性/属性 - 我只在PrgsId上看到一个<schedule>属性...