2009-04-20 2 views
18

SQL Server 2005에서 다음과 같은 xml 열이 있습니다.SQL Server 2005에서 xml 열의 최상위 특성을 선택하려면 어떻게합니까?

<Test foo="bar"> 
    <Otherstuff baz="belch" /> 
</Test> 

varchar로 Test (루트 요소)의 foo 특성 값을 가져올 수 있기를 원합니다. 내 목표는 뭔가 따라 줄 것이다 :

select cast('<Test foo="bar"><Otherstuff baz="belch" /></Test>' as xml).value('@foo','varchar(20)') as Foo 

위의 쿼리를 실행할 때 다음 오류가 나타납니다.

Msg 2390, Level 16, State 1, Line 1 XQuery [value()]: Top-level attribute nodes are not supported

답변

39

존 손더스가 거의 바로 :-)

declare @Data XML 
set @Data = '<Test foo="bar"><Otherstuff baz="belch" /></Test>' 

select @Data.value('(/Test/@foo)[1]','varchar(20)') as Foo 
그것을 가지고를

나를 위해 (SQL Server 2005 및 2008)

마크

+0

을 당신이 루트 요소는 무엇인가 모른다면 .. ??? 이 경우 "Test"라는 것을 알지만 다른 필드의 값에 따라 XML이 다른 XML 필드가 있습니다. 그래서 또는 일 수 있습니다 ... 우리가 사용할 수있는 기본 루트 요소 이름이 있습니까 ??? ??? – Ads

+2

@Ads는 와일드 카드를 사용합니다 (예 : '//Elements/Element [@foo]'구조에 대해 알고 있다면 – StuartLC

+0

괄호 안에 질의를 감싼다. 쳇; 나는 결코 짐작하지 않았을 것이다. TSQL의 XML 쿼리는 훌륭하게 작동하지만 구문이 너무 어렵습니다. – dudeNumber4

3

루트 요소 몰라요 경우

select @Data.value('(/*/@foo)[1]','varchar(20)') as Foo 
관련 문제