2016-11-25 1 views
-6

특정 방식으로 표시하려는 열에 다음 XML이 있습니다. 나는 수색을하고 수색했지만, 그 해결책은 나에게 충분히 구체적이지 않으므로 여기에 간다.xquery를 사용하여 특성 및 값 읽기

XML :

<Top> 
<Branch> 
    <BranchResult Version="1.0" Branch="Croydon" MilesToTravel="11" /> 
    <BranchResult Version="1.0" Branch="Hendon" MilesToTravel="11" /> 
    <BranchResult Version="1.0" Branch="Waltham" MilesToTravel="18" /> 
</Branch> 
<Valuation> 
    <ValuationResult Version="1.0" °IDENTIFIER="thisOne" GuideLow="3159" GuideHigh="4196" /> 
</Valuation> 
</Top> 

나는 결과가이

BRANCH1, 브랜치, 브랜치, IDENTIFIER

크로, 헨던, 월섬, thisOne

이처럼되고 싶습니다 어떻게 내가 SQL 쿼리를 볼 수 있지만 아마도/또는 [] 어딘가에 그것이 작동하지 않습니다. 당신이 그 아이디어를 얻길 바랍니다.

;WITH results AS (
SELECT branchNode.value('*:Branch/BranchResult/@Branch[1]', 'varchar(20)') AS Branch1 
     ,branchNode.value('*:Branch/BranchResult/@Branch[2]', 'varchar(20)') AS Branch2 
     ,branchNode.value('*:Branch/BranchResult/@Branch[3]', 'varchar(20)') AS Branch3 
     ,ValuationNode.value('*:IDENTIFIER[1]', 'varchar(64)') AS IDENTIFIER, 
FROM WWACGuidePriceLookup 
CROSS APPLY res.nodes('//Top') AS branchNodes(branchNode) 
CROSS APPLY res.nodes('//*:Top') AS ValuationNodes(ValuationNode) 
where id = 2  
) select * from results 

죄송합니다. 이것은 첫 시도이며 서식이 잘못되었습니다. 값과 속성을 가져 오는 데 도움이되는 항목이 필요합니다.

+11

"검색하고 검색했지만 해결 방법이 충분하지 않습니다."- 프로그래밍은 요리하려는 요리의 요리법을 검색하는 것과 같지 않으며 원하는 요리를 찾을 수없는 경우 StackOverflow에. 재료를 직접 결합하는 법을 배워야합니다. –

+4

@MichaelKay : 프로그래밍이 요리와 다르다는 점에서 옳습니다. 귀하의 충고는 "프로그래밍하는 것이 더 낫습니다"라고 말하는 것과 같습니다. 그러나 그것은 특별히 건설적인 것은 아닙니다. 무엇을 제안합니까 Stack Overflow는 어떤 것을 시도하고 붙어있을 때 질문 할 수있는 곳이 아닌가? –

+6

프로그래밍 언어를 사용하는 법을 배우려면 언어의 구성 요소와 그 구성 요소를 연구해야합니다. 해결하려는 프로그램과 정확히 동일한 문제를 해결하는 프로그램의 예를 찾아 마스터 할 수는 없습니다. –

답변

1

다음 작업을 수행해야합니다.

if object_id('tempdb.dbo.#tmp') is not null 
    drop table #tmp; 
create table #tmp (x xml); 
insert into #tmp (x) values 
('<Top> 
<Branch> 
    <BranchResult Version="1.0" Branch="Croydon" MilesToTravel="11" /> 
    <BranchResult Version="1.0" Branch="Hendon" MilesToTravel="11" /> 
    <BranchResult Version="1.0" Branch="Waltham" MilesToTravel="18" /> 
</Branch> 
<Valuation> 
    <ValuationResult Version="1.0" IDENTIFIER="thisOne" GuideLow="3159" GuideHigh="4196" /> 
</Valuation> 
</Top>'); 

select 
    BranchNode.value('(BranchResult/@Branch)[1]', 'varchar(20)') as Branch1, 
    BranchNode.value('(BranchResult/@Branch)[2]', 'varchar(20)') as Branch2, 
    BranchNode.value('(BranchResult/@Branch)[3]', 'varchar(20)') as Branch3, 
    ValuationNode.value('(ValuationResult/@IDENTIFIER)[1]', 'varchar(64)') as IDENTIFIER 
from #tmp 
cross apply #tmp.x.nodes('/Top/Branch') as b(BranchNode) 
cross apply #tmp.x.nodes('/Top/Valuation') as v(ValuationNode); 

은 내가 value() 함수 호출 내에서 XPath 식을 변경했습니다. 특히 와일드 카드를 사용하는 대신 경로를 정규화하고 스칼라 값을 생성하기 위해 경로로 인덱싱하기 전에 경로 자체를 괄호로 묶었습니다.

+0

고맙습니다. @ ben-thul! 귀하의 솔루션은 XML과 완벽하게 작동합니다. xmlns를 포함하도록 맨 위 요소를 변경하면 중단됩니다. 이유는 무엇입니까? 예 : ... – zazou

+0

네임 스페이스는 완전히 다른 짐승입니다. https://msdn.microsoft.com/en-us/library/ms177400.aspx를보고 몇 가지 시도해 보시기 바랍니다. 그래도 문제가 해결되지 않으면 시도한 것을 보여주는 다른 질문을하고 다른 사람이 도움을 줄 수 있어야합니다. –

+2

누구에게이 답변을 하향 투표했는지 설명해 주시겠습니까? 나는 위조 된 인터넷 포인트를 위해 이것을하지 않지만, 내가 향상시킬 수있는 것이 있는지 알고 싶다. –