2016-11-05 14 views
2

私はXMLファイルをSQLテーブルに格納しています。今、私はSQLを使ってzの特定の要素の値を読みたいと思っています。XMLから特定の要素を選択XML名前空間

XMLに名前空間要素がない場合、XMLから特定の要素値を読み取ることができます。私は名前空間を持つXMLファイルを読んでみたい。ここで

は私のXMLファイルである:ここで

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

は値を読み取るためのSQLコードです:

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 

答えて

2

あなたは適切なXML名前空間で選択する必要があります。 WITH XMLNAMESPACESを使用して名前空間を宣言し、接頭辞に関連付けることができます。次に、名前空間の要素を参照するときにこの接頭辞を使用します。

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; 
+1

+1私の側から。ワイルドカードを使用する可能性があるため(*:Envelope/*:Cube/*:Cube/*:Cube [通貨= "USD"]/@ *:レート)[1] '、' nvarchar(max) ') ')。だから私は最初に '/ /'を避けるだろう... – Shnugo

+0

@ Shnugoこんにちは!実際、*を選択する必要があるのはおそらく少し厳しいかもしれません。私は、同じ要素名を定義する複数の名前空間があるかどうかわからないときは、一般的なアドバイスをエコーし​​ています。しかし、この場合、ネームスペースが1つしかない場合は、ワイルドカードネームスペース修飾子を選択できます。 –

関連する問題