使用XPATH + SQL创建XML

帕尔

我需要将类似以下示例的内容放在一起,在下面详细说明。我必须通过我的SQL查询来做

这里的例子:

<Rooms>
  <Room id="1|30#30|23|2017-11-10|1|5453|5451|3|0|0" roomCandidateRefId="1" 
   code="1" description="Standard" nonRefundable="false"/>
</Rooms>

这是我尝试的

 select 
   n.c.value('(./@id)[1]','varchar(max)') as 'id',
   n.c.value('(./@roomCandidateRefId)[1]','int') as'roomCandidateRefId',                             
   n.c.value('(./@code)[1]','int') as 'code'
from @res.nodes('//Room') as n(c)
for xml path('Room'),root('Rooms')

关于如何执行此操作的任何建议?非常感谢您的宝贵时间。

示例完成:

<Options>
 <Option supplierCode="" type="Hotel" paymentType="MerchantPay" status="OK">
  <Rooms>
     <Room id="1|30|23|2018-012|0|0" roomCandidateRefId="1" code="39" 
     description="Individual" nonRefundable="true"/>
  </Rooms>
</Option>
  <Option type="Hotel" paymentType="MerchantPay" status="OK">
   <Rooms>
     <Room id="1|30|23|2018-01|0|0" roomCandidateRefId="1" code="39" 
    description="Individual" nonRefundable="true"/>
  </Rooms>
 </Option>

我想得到:

<Room id="1|30|23|2018-012|0|0" roomCandidateRefId="1" code="39" 
description="Individual" nonRefundable="true"/>
Shnugo

您显示的代码是创建XML从XML读取(倾向于从读取)的混合。

但是根据您的问题标题,您想要创建XML。如果我的魔术水晶球效果很好,您将需要以下内容:

DECLARE @rooms_mockup TABLE(id VARCHAR(100),CandidateRefId INT,Code INT, Descr VARCHAR(100),NonRefundable BIT);
INSERT INTO @rooms_mockup VALUES('SomeID 1',1,1,'Description for 1',1)
                               ,('SomeID 2',22,22,'Description for 2',0);
SELECT r.id AS [@id]
      ,r.CandidateRefId AS [@roomCandidateRef]
      ,r.Code AS [@code]
      ,r.Descr AS [@description]
      ,r.NonRefundable AS [@nonRefundable]
FROM @rooms_mockup AS r
FOR XML PATH('Room'),ROOT('Rooms');

结果

<Rooms>
  <Room id="SomeID 1" roomCandidateRef="1" code="1" description="Description for 1" nonRefundable="1" />
  <Room id="SomeID 2" roomCandidateRef="22" code="22" description="Description for 2" nonRefundable="0" />
</Rooms>

暗示:

id值1|30#30|23|2017-11-10|1|5453|5451|3|0|0看起来像一个清晰的1.NF断路器对于导出的数据来说可以这样做,但是对于RDBMS表中的物理存储来说却很糟糕……

更新

根据您更新的问题,您希望<Room>从具有多个房间的XML中获取一个

DECLARE @xml XML=
N'<Options>
 <Option supplierCode="" type="Hotel" paymentType="MerchantPay" status="OK">
  <Rooms>
     <Room id="1|30|23|2018-012|0|0" roomCandidateRefId="1" code="39" 
     description="Individual" nonRefundable="true"/>
  </Rooms>
</Option>
  <Option type="Hotel" paymentType="MerchantPay" status="OK">
   <Rooms>
     <Room id="1|30|23|2018-01|0|0" roomCandidateRefId="1" code="39" 
    description="Individual" nonRefundable="true"/>
  </Rooms>
 </Option>
 </Options>';

-我的示例使用具有房间ID的变量来获取一个特定房间:

 DECLARE @id VARCHAR(100)='1|30|23|2018-012|0|0';
 SELECT @xml.query(N'/Options/Option/Rooms/Room[@id=sql:variable("@id")]');

-如果您的周围环境可能有所不同,则可以使用深度搜索

 SELECT @xml.query(N'//Room[@id=sql:variable("@id")]')

希望这可以帮助...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章