2016-07-05 17 views
0

Ich benötige eine SQL-Abfrage, um den letzten Attributwert von einem XML-Element abzurufen. Ich habe XML wie unten gezeigt. Ich muss Name Name, der 'aktuelle State Contracting' von LegalNames/Name Path abrufen. jede Hilfe zu diesem Thema wird geschätzt ..Ich brauche eine SQL-Abfrage, um den letzten Attributwert von einem XML-Element abzurufen.

<legalNames id="l5922F64208E14D97BEE4C2E94B670146" deleted="0"> 
    <operatingNames id="o370FA0A9EAE54290B132211A1EB28D8D" deleted="0"> 
    <Name>CSR Contracting</Name> 
    </operatingNames> 
    <Name prior="" id="N45BF84B89B4F4DB987C07EF568E585D9">Current State Contracting</Name> 
</legalNames> 
+1

Meine Antwort war ein bisschen zu schnell, da Sie nicht angeben, welche RDBMS Sie verwenden. Bitte kennzeichnen Sie Ihre Frage mit dem entsprechenden Produkt und der entsprechenden Version! – Shnugo

Antwort

0

entschuldigen uns für die verzögerte Antwort, fand ich tatsächlich eine Lösung dafür. Die Verwendung von (.) Anstelle von Spalte löst das Problem ('(.) [1]', 'varchar (500)'). Unten war mein genauer Code, um alle Werte von LegalNames/Name Pfad zu erhalten.

SELECT HistoryID, 
    x.r.value('(@id)[1]', 'varchar(500)') AS NameID, 
    x.r.value('(@prior)[1]', 'varchar(500)') AS Name_prior, 
    x.r.value('(.)[1]', 'varchar(500)') AS Name  
From 
    (select HistoryID,XMLData 
    FROM [Compass Source_Test].dbo.Temp_History_table_july11) s 
    CROSS apply s.XMLData.nodes('legalNames/Name') as x(r) 
+0

HI, großartig, dass du selbst eine Lösung gefunden hast! Aber bitte erlauben Sie mir einen Hinweis: Diese Antwort ist absolut keine Hilfe für jemanden, der versucht, eine Lösung für ein verwandtes Problem zu finden. Dein '('(.) [1]', 'varchar (500)')' wählt das * erste Vorkommen des aktuellen Knotens *, was eher - uhm - bedeutungslos ist ... Versuche, ein minimales Arbeitsbeispiel einzuschließen (Sie könnten von meiner Antwort kopieren, um Ihre Lösung zu demonstrieren. Und bitte markieren Sie Ihre Frage mit dem RDBMS, das Sie verwenden. Glückliche Kodierung! – Shnugo

+0

Hi nochmal, danke für den Code! Um Ihnen bei zukünftigen Fragen zu helfen: In Ihrer Frage haben Sie nicht gesagt, dass dies von einem Tisch kommt - ein großer Unterschied. Ihr Ansatz mit '.nodes()' navigiert zum eigentlichen Element, das Ihre Aufrufe von '.value()' möglich macht. Dies ist nur sinnvoll, wenn Sie mehrere Werte von derselben Position holen wollen. Wieder etwas, das du in deiner Frage nicht angegeben hast. Deine Antwort deckt eigentlich ein anderes Thema ab ... Und übrigens: Dein Code sollte auch ohne das '() [1]' funktionieren. Glückliche Kodierung! – Shnugo

0

Probieren Sie es wie diese (SQL-Server-Syntax):

DECLARE @xml XML= 
'<legalNames id="l5922F64208E14D97BEE4C2E94B670146" deleted="0"> 
    <operatingNames id="o370FA0A9EAE54290B132211A1EB28D8D" deleted="0"> 
    <Name>CSR Contracting</Name> 
    </operatingNames> 
    <Name prior="" id="N45BF84B89B4F4DB987C07EF568E585D9">Current State Contracting</Name> 
</legalNames>'; 

select @xml.value('(/legalNames/Name)[1]','nvarchar(max)') 
+0

Danke für die Antwort Shnugo. – Dugyala