2017-05-27 4 views
2

Ich möchte die Werte von demselben XML-Knoten unter demselben Element abrufen.Mehrere Werte aus derselben XML-Spalte in SQL Server abrufen

Beispieldaten:

Ich habe alle <award_number> Werte auszuwählen.

Das ist mein SQL-Code:

DECLARE @xml XML; 

DECLARE @filePath varchar(max); 

SET @filePath = '<workFlowMeta><fundgroup><funder><award_number>0710564</award_number><award_number>1106058</award_number><award_number>1304977</award_number><award_number>1407404</award_number></funder></fundgroup></workFlowMeta>' 

SET @xml = CAST(@filePath AS XML); 

SELECT       
    REPLACE(Element.value('award_number','NVARCHAR(255)'), CHAR(10), '') AS award_num 
FROM  
    @xml.nodes('workFlowMeta/fundgroup/funder') Datalist(Element); 

Kann nicht dieses @xml.nodes('workFlowMeta/fundgroup/funder') ändern, weil ich mehrere Knotenwerte innerhalb funder Knoten immer bin.

Kann mir bitte jemand helfen?

Antwort

1

Da diese <award_number> Knoten sind in den <funder> Knoten, und könnte es mehrere <funder> Knoten sein (wenn ich Ihre Frage richtig verstanden), müssen Sie wie folgt aus zwei .nodes() Anrufe verwenden:

SELECT       
    XC.value('.', 'int') 
FROM  
    @xml.nodes('/workFlowMeta/fundgroup/funder') Datalist(Element) 
CROSS APPLY 
    Element.nodes('award_number') AS XT(XC) 

Die erste .nodes() Anruf ruft alle <funder> Elemente, und dann der zweite Aufruf geht in jedem <funder> Element, um alle <award_number> Knoten innerhalb dieses Elements zu erhalten und gibt den Wert des Elements <award_number> als INT (ich konnte nicht ganz verstehen, was Sie versuchen zu tun war, zu dem <award_number> Wert im Code Probe ....)

+0

Hallo, ich "plused" Ihre, wie es früher war als meine und ist eine gute Antwort natürlich ... – Shnugo

+0

Vielen Dank marc. Es hat mir wirklich geholfen. – Anitha

1

Ihr eigener Code ganz in der Nähe, aber

  • Sie tauchen ein Niveau zu niedrig
  • benötigen Sie ein setzen singleton XPath für .value(). In den meisten Fällen bedeutet dies eine [1] am Ende)

Wie Sie viele<award_number> Elemente lesen möchten, ist dies die Ebene, die Sie in .nodes() Schritt nach unten haben. Das Lesen dieser Werte des Elements ist einfach, wenn Sie Ihre Hände auf sie haben:

SELECT       
    REPLACE(Element.value('text()[1]','NVARCHAR(255)'), CHAR(10), '') AS award_num 
FROM  
    @xml.nodes('/workFlowMeta/fundgroup/funder/award_number') Datalist(Element); 

Was Sie mit dem REPLACE() versuchen zu tun?
Wenn alle <arward_number> Elemente gültige Nummern enthalten, sollten Sie int oder bigint als Zieltyp verwenden, und es sollte nicht notwendig sein, nicht numerische Zeichen zu ersetzen. Probieren Sie es wie folgt aus:

SELECT Element.value('text()[1]','int') AS award_num 
FROM @xml.nodes('/workFlowMeta/fundgroup/funder/award_number') Datalist(Element); 

Wenn marc_s korrekt ist ...
... und Sie haben mit mehreren <funder> Gruppen beschäftigen, von denen jeder mehrere <award_number> Knoten enthält, mit seinem Ansatz gehen (zwei Anrufe an .nodes())

Verwandte Themen