【问题标题】:Parsing highly structured XML in SQL server在 SQL Server 中解析高度结构化的 XML
【发布时间】:2016-06-02 13:02:29
【问题描述】:

关于 SQL 的 XML 解析功能,我有点深陷其中。

我收到了一段看起来有点像这样的 XML-

<AuSale>
  <SubscriptionId>d5a996c0</SubscriptionId>
  <Auns>
    <AuNight>
      <AunId>00000000-0000</AunId>
      <Night>2014-10-23T00:00:00</Night>
      <AuId>4b8ca8db</AuId>
      <State>Booked</State>
      <RatePrice>
        <RatePrice>
          <AunId>00000000-0000</AunId>
          <Id>2143124</Id>
          <Price>565665</Price>
        </RatePrice>
        <RatePrice>
          <AunId>00000000-0000</AunId>
          <Id>jtty54</Id>
          <Price>65383</Price>
        </RatePrice>
      </RatePrice>
    </AuNight>
    <AuNight>
      <AunId>00000000-0000</AunId>
      <Night>2014-10-24T00:00:00</Night>
      <AuId>4b8ca8db</AuId>
      <State>Booked</State>
      <RatePrice>
        <RatePrice>
          <AunId>00000000-0000</AunId>
          <Id>2143124</Id>
          <Price>565665</Price>
        </RatePrice>
      </RatePrice>
    </AuNight>
  </Auns>
</AuSale>

而且我需要能够从中提取这样的数据集-

SubscriptionId  AunId       Night               AuId        State   Id      Price
-------------------------------------------------------------------------------------
d5a996c0    00000000-0000   2014-10-23T00:00:00 4b8ca8db    Booked  2143124 565665
d5a996c0    00000000-0000   2014-10-23T00:00:00 4b8ca8db    Booked  jtty54  65383
d5a996c0    00000000-0000   2014-10-24T00:00:00 4b8ca8db    Booked  2143124 565665

我可以使用这样的命令提取单个元素-

SELECT 
bookref.ent.value('SubscriptionId[1]','nvarchar(50)') as 'subid',
bookref.ent.value('(Auns/AuNight/AunId)[1]','nvarchar(50)') as 'nightid',
bookref.ent.value('(Auns/AuNight/AunId)[1]','nvarchar(50)') as 'nightid',
bookref.ent.value('(Auns/AuNight/RatePrice/RatePrice/Price)[1]','nvarchar(50)') as 'nightid',
bookref.ent.value('(Auns/AuNight/RatePrice/RatePrice/Price)[2]','nvarchar(50)') as 'nightid2'
FROM @testxml.nodes('/AuSale') bookref(ent)

但问题在于,我不知道我们可能会获得多少个 AUNight 和 RatePrice 节点实例。我不知道如何让 SQL 处理这种不确定性并提取所有节点的详细信息,无论实际有多少节点。

我尝试使用变量而不是硬编码的数字/引用,但如果我这样做,整个事情就会爆炸并拒绝运行。 有什么建议吗?

【问题讨论】:

  • 这看起来像是一个真正想要 3-4 个表格的文档。
  • 在这种情况下,我尝试创建一个外部服务/应用程序来读取 XML,从中生成记录,然后将其保存回数据库中的表中。您必须在 SQL 中执行所有这些操作有什么特别的原因吗? ...不过,有趣的问题。
  • >这看起来像是一个真正想要 3-4 个表的文档 这实际上是它试图表示的内容。我将使用它来填充几个表,但是我需要首先完成各种查找和其他问题。基本上,这是您不时遇到的“独特”情况之一。

标签: sql-server xml parsing xpath sqlxml


【解决方案1】:
select
    s.c.value('SubscriptionId[1]','nvarchar(50)') as SubscriptionId,
    a.c.value('AunId[1]','nvarchar(50)') as AunId,
    a.c.value('Night[1]','nvarchar(50)') as Night,
    a.c.value('State[1]','nvarchar(50)') as [State],
    rp.c.value('Id[1]','nvarchar(50)') as Id,
    rp.c.value('Price[1]','nvarchar(50)') as Price
from @data.nodes('AuSale') as s(c)
    outer apply s.c.nodes('Auns/AuNight') as a(c)
    outer apply a.c.nodes('RatePrice/RatePrice') as rp(c)

【讨论】:

  • 这看起来非常有希望。谢谢罗马,我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
相关资源
最近更新 更多