我需要将类似以下示例的内容放在一起,在下面详细说明。我必须通过我的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"/>
您显示的代码是创建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] 删除。
我来说两句