2014-02-17 5 views
0

Sql Server의 XML 열에 위에 뷰를 제공하려는 일부 XML이 있습니다. 특히 전체 XML 청크 자체와 함께 루트 요소의 "버전"특성을 드러내고 싶습니다.SQL Server에서 XML 데이터 (특성) 쿼리

테이블에는 "트리"라는 단일 열이 있습니다. 나는 이런 식으로 쿼리 할 때

<?xml version="1.0" encoding="utf-8" ?> 
<ClassificationTree xmlns="http://schemas.tempuri.org/2014/02/17" version="1.0"> 
    <Classification name="WTG" priority="1"> 
    <Classification name="Corrective" priority="1"> 
     <Classification name="RDSPP-Codes" priority="1" /> 
    </Classification> 
    <Classification name="Predetermined" priority="2"> 
     <Classification name="Non Service related (tests, visits etc)" priority="1" /> 
     <Classification name="Scheduled Service" priority="2" /> 
    </Classification> 
    </Classification> 
</ClassificationTree> 

:

XML은 다음과 같습니다

WITH XMLNAMESPACES ('http://schemas.tempuri.org/2014/02/17' AS ns1) 
select 
    Tree.value('(/ns1:ClassificationTree/@version)[0]','varchar(20)') as Version 
    , Tree 
from 
    ClassificationTree 

내가 XML을 청크 모든 권리를 얻을 수 있지만, "버전"A 행은 NULL입니다.

무엇이 여기에 있습니까?

답변

2

1에서 XQuery를 시작으로 인덱스 및 0이 아닌 내가 당신의 쿼리 내에서 교체하려고 처음 제안 :

(/ns1:ClassificationTree/@version)[0] 

에 : 당신은 아마 의미했다 그러나 무엇

(/ns1:ClassificationTree/@version)[1] 

-

/ns1:ClassificationTree[1]/@version 

첫 번째 ClassificationTree에서 version 특성을 가져오고 싶습니다. 당신이하는 일은 모든 ClassificationTrees의 모든 버전을 검색 한 다음 첫 번째를 선택하는 것입니다 (또는 [1]이 아닌 [0]을 사용했다면 훨씬 덜 효율적입니다).

+0

+1 설명이 있지만 SQL Server 구현은 실제로 첫 번째 실행을 더 빠르게 만듭니다. –

+0

SQL Server는 테이블 값 함수를 사용하여 첫 번째 항목을 찾습니다 (맨 위 사용). 첫 번째 버전에서는 함수가 한 번 실행되어 값을 찾았고 두 번째 항목에서는 노드를 찾기 위해 한 번 실행되고 두 번째 시간은 두 번째로 실행됩니다. 속성 값을 찾습니다. –

관련 문제