2017-03-22 5 views
0

Ich bin sehr neu in der XML & schreiben XPath Abfragen.XPATH wählen eindeutige Werte ID und Flag

Wie wähle ich ID und Flag Node über XPath?

Ich möchte alle Knoten erhalten, die ID enthalten oder haben, um es in eine SQL-Spalte aufzunehmen.

Irgendeine Idee, wie man das bekommt?

<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> 

Ich bin mit SQL 2008 -Danke

+0

Gegeben zurück, der XML-Beispiel, schreiben Sie bitte, wie die Ausgabe genau * sollte * .. und zeigen Sie die Abfrage, die Sie bisher versucht haben – har07

Antwort

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 

Hier ist die Ausgabe

Result

Wenn Sie die IDs mit Knoten auswählen möchten, dann können Sie sich wie zu tun unter -

SELECT T.c.query('.') AS result 
from @HotelXml.nodes('/Hoteles/Hotel/ID') T(c) 

Lassen Sie mich wissen, wenn Sie etwas anderes brauchen.

Dank

+0

'FROM OPENXML' mit den entsprechenden SPs vorzubereiten und ein Dokument zu entfernen ist veraltet und sollte nicht mehr verwendet werden (seltene Ausnahmen e xist). Verwenden Sie stattdessen die entsprechenden [Methoden, die der XML-Datentyp bietet] (https://msdn.microsoft.com/en-us/library/ms190798.aspx). – Shnugo

1

Ihre Frage ist ziemlich unklar ...

Ich möchte alle Knoten erhalten, oder mit ID enthalten, es in einer SQL-Spalte enthalten.

???

Der folgende Code zeigt einige Ansätze zum Abrufen von Daten aus XML. Wenn dies Ihr Problem nicht lösen, lesen Sie bitte How to ask a good SQL question und 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. 

das Hotel mit dem angegebenen ID holen

DECLARE @id INT=8503; 
SELECT @xml.query(N'/Hoteles/Hotel[ID=sql:variable("@id")]') 

gibt den vollständigen Knoten

<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> 

Rückkehr alle ids

SELECT id.value(N'(./text())[1]','int') AS ID 
FROM @xml.nodes(N'/Hoteles/Hotel/ID') AS A(id) 

Ergebnis ist eine Liste von IDs

14993 
8503 
11424 

Rückkehr eine abgeleitete Tabelle

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) 

eine Tabelle

+-------+-----------------+--------+-----------+-----------+ 
| ID | DiasDesdeInicio | Noches | Ciudad_ID | Ciudad_ID | 
+-------+-----------------+--------+-----------+-----------+ 
| 14993 | 0    | 1  | TUC  | D   | 
+-------+-----------------+--------+-----------+-----------+ 
| 8503 | 1    | 1  | CAF  | C   | 
+-------+-----------------+--------+-----------+-----------+ 
| 11424 | 2    | 4  | SLA  | S   | 
+-------+-----------------+--------+-----------+-----------+