【问题标题】:Hierarchy XML to SQL层次结构 XML 到 SQL
【发布时间】:2012-11-27 12:24:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 中您想要的属性/属性 - 我在&lt;schedule&gt; 上只看到一个PrgsId 属性...

    【讨论】:

    • 谢谢。我明白。如果我需要更多帮助,我会回来的。
    • @user1607079:更新了我的回复,展示了如何首先加载外部 XML 文件。此文件必须在 SQL Server 计算机的硬盘上。如果该 SQL Server 计算机不是您的本地 PC,则该 SQL Server 计算机无法读取您自己的本地硬盘 - 该文件必须位于服务器计算机上的该定义目录中跨度>
    • 但是,如果我有这样的:@input.nodes('/schedules') AS XTbl(Schdl) 并且我想提取 Tip = Schdl.value('@type', ' varchar(MAX)') 。 Foreach 'tip' 我在上面定义了 Name 和 Id (你的答案 - 我从这里提取它们 @input.nodes('/schedules/schedule/lala') AS XTbl(Prgs))
    • @user1607079:请不要将代码示例或示例数据放入 cmets - 因为您无法对其进行格式化,所以阅读它非常困难。 ... 相反:要么更新您的问题,通过编辑它来提供额外的信息 - 或者提出一个全新的问题!谢谢。
    • 谢谢。这就是我正在寻找的(那个交叉应用命令)。是的,我已经有了 XML-s
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2021-09-29
    相关资源
    最近更新 更多