1

我有一个包含多个元素和属性的 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 键

4

1 回答 1

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>

于 2012-11-27T12:27:09.667 回答