【问题标题】:Return all xml nodes import into SQL Server返回所有 xml 节点导入到 SQL Server
【发布时间】:2010-01-12 17:25:24
【问题描述】:

我已将一个 xml 文档导入 SQL Server,我现在正尝试将各个部分导入不同的表中。当我使用下面的查询时,它只返回一行hotel_facilities,我需要返回所有hotel_facilities 和hotel_ref。

DECLARE @Details xml 
    SET @Details = '<hotels>
 <hotel>
  <hotel_ref>105</hotel_ref> 
 <hotel_facilities>
  <id>2</id> 
  <name>Disabled Facilities</name> 
  <id>4</id> 
  <name>24 Hour Reception</name> 
  <id>12</id> 
  <name>Restaurant</name> 
  </hotel_facilities>
  </hotel>
</hotels>'  

SELECT tab.col.value('../hotel_ref[1]','varchar(100)') AS 'hotel_ref',
tab.col.value('./id[1]','varchar(100)') AS 'HotelFacilityID',
tab.col.value('./name[1]','varchar(100)') AS 'HotelFacilityName'
FROM @Details.nodes('//hotels/hotel/hotel_facilities') AS tab(col)

【问题讨论】:

    标签: sql-server xml-import


    【解决方案1】:

    您的 XML 结构有点滑稽 - &lt;hotel_facilities&gt; 不包含您可以枚举的适当“子实体”......

    如果您的设施将被包装到 &lt;facility&gt;....&lt;/facility&gt; 元素中,您可以轻松地枚举它。

       <hotel_facilities>
          <facility>
             <id>2</id> 
             <name>Disabled Facilities</name> 
          </facility>
          <facility>
             <id>4</id> 
             <name>24 Hour Reception</name> 
          </facility>
          <facility>
             <id>12</id> 
             <name>Restaurant</name> 
          </facility>
       </hotel_facilities>
    

    但是以您当前的设置,我认为您将很难找到一个好的解决方案....

    【讨论】:

      【解决方案2】:

      我同意 marc_s XML 没有好的架构。

      我能得到的最接近的是:

      SELECT tab.col.value('./hotel_ref[1]','varchar(100)') AS 'hotel_ref', 
      fac.value('(.)[1]','varchar(100)') AS 'HotelFacilityID', 
      ROWID=IDENTITY(int,1,1) 
      into #facilitiesid 
      FROM @Details.nodes('/hotels/hotel') AS tab(col) 
      cross apply col.nodes('.//id') a(fac) 
      
      
      SELECT tab.col.value('../hotel_ref[1]','varchar(100)') AS 'hotel_ref', 
      fac.value('(.)[1]','varchar(100)') AS 'HotelFacilityName', 
      ROWID=IDENTITY(int,1,1) 
      into #facilitiesnames 
      FROM @Details.nodes('//hotels/hotel/hotel_facilities') AS tab(col) 
      cross apply col.nodes('.//name') a(fac) 
      
      select i.hotel_ref, HotelFacilityID, HotelFacilityName 
      from #facilitiesid i 
      inner join #facilitiesnames n 
          on i.rowid = n.rowid 
      

      【讨论】:

      • 我正在尝试类似的东西,但由于“id”和“name”元素在 节点内确实没有任何关联,恐怕在某些时候,你'最终会把一个不属于一起的 id 和一个名字放在一起......但老实说,我也没有看到更好的解决方案。
      • 你从一开始就是对的,这是一个 XML 模式问题。我只是假设 Steve 不能更改模式并且 XML 元素的顺序决定了它们之间的关系。你又是对的,我们最终可能会产生不良的联想。
      • 我只是收到 xml 文件,无法控制它。这两种解决方案的问题在于,当您添加另一个酒店节点及其 hotel_facilities 时,两种解决方案都会重复每个酒店的节点。
      • 我刚刚在交叉应用中添加了一个 .//。这应该可以解决问题。
      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      相关资源
      最近更新 更多