我对XML&编写XPath查询。
如何通过xpath选择id和flag节点?
我想获取包含或具有id的所有节点,以将其包含在sql列中。
知道如何获得这个吗?
<Hoteles>
<Hotel>
<Orden>1</Orden>
<DiasDesdeInicio>0</DiasDesdeInicio>
<Noches>1</Noches>
<ID>14993</ID>
<Nombre>1XX</Nombre>
<Ciudad>
<ID>TUC</ID>
<Nombre>D</Nombre>
</Ciudad>
<Categoria>*****</Categoria>
<Cupo>
<Flag>1</Flag>
</Cupo>
</Hotel>
<Hotel>
<Orden>2</Orden>
<DiasDesdeInicio>1</DiasDesdeInicio>
<Noches>1</Noches>
<ID>8503</ID>
<Nombre>2XXX</Nombre>
<Ciudad>
<ID>CAF</ID>
<Nombre>C</Nombre>
</Ciudad>
<Categoria>***</Categoria>
<Cupo>
<Flag>0</Flag>
</Cupo>
</Hotel>
<Hotel>
<Orden>3</Orden>
<DiasDesdeInicio>2</DiasDesdeInicio>
<Noches>4</Noches>
<ID>11424</ID>
<Nombre>3XXX</Nombre>
<Ciudad>
<ID>SLA</ID>
<Nombre>S</Nombre>
</Ciudad>
<Categoria>****</Categoria>
<Cupo>
<Flag>1</Flag>
</Cupo>
</Hotel>
</Hoteles>
我正在使用SQL 2008 -thanks
答案 0 :(得分:1)
Declare @HotelXml xml
Select @HotelXml = '<Hoteles>
<Hotel>
<Orden>1</Orden>
<DiasDesdeInicio>0</DiasDesdeInicio>
<Noches>1</Noches>
<ID>14993</ID>
<Nombre>1XX</Nombre>
<Ciudad>
<ID>TUC</ID>
<Nombre>D</Nombre>
</Ciudad>
<Categoria>*****</Categoria>
<Cupo>
<Flag>1</Flag>
</Cupo>
</Hotel>
<Hotel>
<Orden>2</Orden>
<DiasDesdeInicio>1</DiasDesdeInicio>
<Noches>1</Noches>
<ID>8503</ID>
<Nombre>2XXX</Nombre>
<Ciudad>
<ID>CAF</ID>
<Nombre>C</Nombre>
</Ciudad>
<Categoria>***</Categoria>
<Cupo>
<Flag>0</Flag>
</Cupo>
</Hotel>
<Hotel>
<Orden>3</Orden>
<DiasDesdeInicio>2</DiasDesdeInicio>
<Noches>4</Noches>
<ID>11424</ID>
<Nombre>3XXX</Nombre>
<Ciudad>
<ID>SLA</ID>
<Nombre>S</Nombre>
</Ciudad>
<Categoria>****</Categoria>
<Cupo>
<Flag>1</Flag>
</Cupo>
</Hotel>
</Hoteles>'
declare @XmlOutPut int
Begin Transaction
exec sp_xml_preparedocument @XmlOutPut output, @HotelXml
select newXML.ID from
OPENXML(@XmlOutPut,'/Hoteles/Hotel',3) with (ID int) newXML
--IF @@ERROR <> 0 BEGIN ROLLBACK RETURN 0 END
--select 1
Commit
exec sp_xml_removedocument @XmlOutPut
这是输出
如果要选择带节点的ID,则可以执行以下操作 -
SELECT T.c.query('.') AS result
from @HotelXml.nodes('/Hoteles/Hotel/ID') T(c)
如果你需要别的东西,请告诉我。
由于
答案 1 :(得分:1)
你的问题很不清楚......
我想获取包含或具有id的所有节点,以将其包含在sql列中。
???
以下代码演示了如何从XML中检索数据的一些方法。如果这不能解决您的问题,请阅读How to ask a good SQL question和How to create a MCVE
DECLARE @xml XML=
N'<Hoteles>
<Hotel>
<Orden>1</Orden>
<DiasDesdeInicio>0</DiasDesdeInicio>
<Noches>1</Noches>
<ID>14993</ID>
<Nombre>1XX</Nombre>
<Ciudad>
<ID>TUC</ID>
<Nombre>D</Nombre>
</Ciudad>
<Categoria>*****</Categoria>
<Cupo>
<Flag>1</Flag>
</Cupo>
</Hotel>
<Hotel>
<Orden>2</Orden>
<DiasDesdeInicio>1</DiasDesdeInicio>
<Noches>1</Noches>
<ID>8503</ID>
<Nombre>2XXX</Nombre>
<Ciudad>
<ID>CAF</ID>
<Nombre>C</Nombre>
</Ciudad>
<Categoria>***</Categoria>
<Cupo>
<Flag>0</Flag>
</Cupo>
</Hotel>
<Hotel>
<Orden>3</Orden>
<DiasDesdeInicio>2</DiasDesdeInicio>
<Noches>4</Noches>
<ID>11424</ID>
<Nombre>3XXX</Nombre>
<Ciudad>
<ID>SLA</ID>
<Nombre>S</Nombre>
</Ciudad>
<Categoria>****</Categoria>
<Cupo>
<Flag>1</Flag>
</Cupo>
</Hotel>
</Hoteles>';
--I want to get all nodes that contain or having id , to include it in a sql column.
选择具有给定ID的酒店
DECLARE @id INT=8503;
SELECT @xml.query(N'/Hoteles/Hotel[ID=sql:variable("@id")]')
返回完整节点
<Hotel>
<Orden>2</Orden>
<DiasDesdeInicio>1</DiasDesdeInicio>
<Noches>1</Noches>
<ID>8503</ID>
<Nombre>2XXX</Nombre>
<Ciudad>
<ID>CAF</ID>
<Nombre>C</Nombre>
</Ciudad>
<Categoria>***</Categoria>
<Cupo>
<Flag>0</Flag>
</Cupo>
</Hotel>
返回所有ID
SELECT id.value(N'(./text())[1]','int') AS ID
FROM @xml.nodes(N'/Hoteles/Hotel/ID') AS A(id)
结果是ID列表
14993
8503
11424
返回派生表
SELECT The.hotel.value(N'(ID)[1]','int') AS ID
,The.hotel.value(N'(DiasDesdeInicio)[1]','int') AS DiasDesdeInicio
,The.hotel.value(N'(Noches)[1]','int') AS Noches
,The.hotel.value(N'(Ciudad/ID)[1]','nvarchar(max)') AS Ciudad_ID
--more elements
,The.hotel.value(N'(Ciudad/Nombre)[1]','nvarchar(max)') AS Ciudad_ID
--more elements
FROM @xml.nodes(N'/Hoteles/Hotel') AS The(hotel)
返回一个表
+-------+-----------------+--------+-----------+-----------+
| ID | DiasDesdeInicio | Noches | Ciudad_ID | Ciudad_ID |
+-------+-----------------+--------+-----------+-----------+
| 14993 | 0 | 1 | TUC | D |
+-------+-----------------+--------+-----------+-----------+
| 8503 | 1 | 1 | CAF | C |
+-------+-----------------+--------+-----------+-----------+
| 11424 | 2 | 4 | SLA | S |
+-------+-----------------+--------+-----------+-----------+