2016-11-05 2 views
2

SQL 테이블에 XML 파일이 저장되어 있습니다. 이제는 SQL을 사용하여 z 특정 요소 값을 읽고 싶습니다.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 네임 스페이스에서 선택해야

여기 내 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 내 옆에서. 말할 것도없이 와일드 카드 (.value ('(* : Envelope/* : Cube/* : Cube/* : Cube [* * : 통화 = "USD"]/@ * : 속도) [1] ','nvarchar (max) ')')하지만 더 명확한 것이 좋습니다. 그러므로 나는 처음에'//'를 피할 것이다. – Shnugo

+0

@ Shnugo 안녕 Shnugo! 실제로 * *를 선택해야 할 필요가있을 수 있습니다. 동일한 요소 이름을 정의하는 여러 네임 스페이스가 있는지 여부를 모르는 경우 일반적인 조언을 보여줍니다. 그러나이 경우 네임 스페이스가 하나만 있으면 와일드 카드 네임 스페이스 한정자를 선택할 수 있습니다. –

관련 문제