【问题标题】:XPATH select distinct values ID and flagXPATH 选择不同的值 ID 和标志
【发布时间】:2017-03-22 02:47:23
【问题描述】:

我对 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 -谢谢

【问题讨论】:

  • 鉴于该 XML 示例,请发布输出应该如何确切地..并显示您迄今为止尝试过的查询

标签: sql-server xml xpath xquery


【解决方案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)

如果您还需要其他东西,请告诉我。

谢谢

【讨论】:

  • FROM OPENXML 与相应的 SP 准备和删除文档已过时,不应再使用(存在罕见的例外情况)。而是使用适当的methods the XML data type provides
【解决方案2】:

你的问题很不清楚……

我想获取所有包含或具有 id 的节点,以将其包含在 sql 列中。

???

以下代码演示了如何从 XML 中检索数据的一些方法。如果这不能解决您的问题,请阅读How to ask a good SQL questionHow 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         |
+-------+-----------------+--------+-----------+-----------+

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 2012-11-28
    • 2012-01-31
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多