【发布时间】: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