2009-10-13 2 views
30

ich so etwas wie das folgende XML in einer Spalte einer Tabelle habe:Wie ein bestimmtes Attribut von XML-Elemente in SQL Server erhalten

<?xml version="1.0" encoding="utf-8"?> 
<container> 
    <param name="paramA" value="valueA" /> 
    <param name="paramB" value="valueB" /> 
    ... 
</container> 

Ich versuche zu bekommen, die WertB Teil aus der XML über TSQL

Bis jetzt bekomme ich den richtigen Knoten, aber jetzt kann ich nicht herausfinden, wie man das Attribut bekommt.

select xmlCol.query('/container/param[@name="paramB"]') from LogTable 

Ich denke, ich konnte einfach hinzufügen/@ Wert bis zum Ende, aber dann SQL sagt mir Attribute Teil eines Knotens sein. Ich kann eine Menge Beispiele finden, um die Attribute der Kindknoten auszuwählen, aber nichts über die Geschwisterattribute (wenn das der richtige Ausdruck ist).

Jede Hilfe wäre willkommen.

Antwort

51

Versuchen Sie, die .value Funktion statt .query mit:

SELECT 
    xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
FROM 
    LogTable 

Der XPath-Ausdruck möglicherweise eine Liste von Knoten zurückkehren konnte, daher müssen Sie ein [1] zu diesem Potential Liste hinzufügen SQL Server zu sagen, die ersten zu verwenden dieser Einträge (und ja - diese Liste ist 1-basiert - nicht 0-basiert). Als zweiten Parameter müssen Sie angeben, in welchen Typ der Wert konvertiert werden soll - hier einfach raten.

Marc

+1

Danke. Genau das, was ich brauchte. –

+0

Ich habe dynamischen Knoten im Feld wie Durch die Ihre give Abfrage ich in der Lage bin nach Index zu lesen. Mittel Wenn ich Index als 1 gebe, wird es 2 anzeigen, und wenn ich Index 2 gebe, wird es 5 anzeigen, aber ich benötige beide Knoten. also würdest du mir bitte vorschlagen, wie es geht! – pixelbyaj

+0

Ich habe Probleme, dies für einen Boolean zu verwenden. Ich habe versucht, 'boolean' und 'System.Boolean' als zweite Parameter zu verwenden und einen Fehler erhalten. Wenn ich varchar mache, gibt es alle Nullen zurück. Meine XML-Zeile sieht folgendermaßen aus: Zac

5

auf der die tatsächliche Struktur Ihres xml Abhängig kann es nützlich sein, einen Blick auf sie zu setzen, um es einfacher zu konsumieren mit ‚normalen‘ SQL zB

CREATE VIEW vwLogTable 
AS 
SELECT 
    c.p.value('@name', 'varchar(10)') name, 
    c.p.value('@value', 'varchar(10)') value 
FROM 
    LogTable 
    CROSS APPLY x.nodes('/container/param') c(p) 
GO 


-- now you can get all values for paramB as... 
SELECT value FROM vwLogTable WHERE name = 'paramB' 
+0

Warum funktioniert xmlCol.value ('(/ container/param [@ name = "paramB"]/@ value) [1]', 'varchar (50)') nicht für mich, sondern nur .value ('@ value' , 'vharchar (50)') funktioniert? Hmmmmm. – AndyClaw

0

$doc/param[@value = "valueB"]/fn:data(@value)
Angenommen, $ Doc hat das Xml.

Verwandte Themen