Wählen Sie ein bestimmtes Element aus XML mit XML-Namespace aus

Ich habe eine XML-file in einer SQL-Tabelle gespeichert. Jetzt möchte ich z spezifischen Elementwert mit SQL lesen.

Ich kann einen bestimmten Elementwert aus dem XML lesen, wenn das XML kein Namensraumelement darin hat. Ich möchte XML-file mit Namespace lesen.

Hier ist meine XML-file:

<currency:Envelope xmlns="http://www.currency.com/eurofxref" xmlns:currency="http://www.currency.org/xml/2002-08-01"> <Cube> <Cube time="2016-11-04"> <Cube currency="USD" rate="1.1093" /> <Cube currency="JPY" rate="114.24" /> <Cube currency="BGN" rate="1.9558" /> <Cube currency="CZK" rate="27.021" /> </Cube> </Cube> </currency:Envelope> 

Hier ist der SQL-Code zum Lesen der Werte:

 CREATE TABLE XMLwithOpenXML ( Id INT IDENTITY PRIMARY KEY, XMLData XML, LoadedDateTime DATETIME ) INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime) SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() FROM OPENROWSET(BULK 'E:\currency.xml', SINGLE_BLOB) AS x; SELECT XMLData.value('(Cube/Cube/Cube[@currency="USD"]/@rate)[1]','VARCHAR(MAX)') FROM XMLwithOpenXML 

Sie müssen im richtigen XML-Namespace auswählen. Sie können den Namespace mit WITH XMLNAMESPACES deklarieren und ihn mit einem Präfix verknüpfen . Verwenden Sie dann dieses Präfix, wenn Sie auf Elemente im Namensraum verweisen.

 WITH XMLNAMESPACES('http://www.currency.com/eurofxref' AS efr) SELECT rate=XMLData.value('(//efr:Cube/efr:Cube/efr:Cube[@currency="USD"]/@rate)[1]','VARCHAR(MAX)') FROM XMLwithOpenXML;