2009-10-13 3 views
30

SQL Server의 XML 요소에서 특정 속성을 얻는 방법 :나는 테이블의 컬럼에 다음과 같은 XML과 같은 뭔가를

<?xml version="1.0" encoding="utf-8"?> 
<container> 
    <param name="paramA" value="valueA" /> 
    <param name="paramB" value="valueB" /> 
    ... 
</container> 

내가 TSQL을 통해 XML 밖으로 VALUE (단위 : 십억) 부분을 얻기 위해 노력하고 있어요을

지금까지 올바른 노드를 얻었으나 이제 속성을 가져 오는 방법을 알 수 없습니다.

select xmlCol.query('/container/param[@name="paramB"]') from LogTable 

나는 마지막에/@ 값을 추가 할 수 있지만 SQL은 속성이 노드의 일부가되어야한다고 알려줍니다. 하위 노드 속성을 선택하는 데 많은 예제가 있지만 형제 애트리뷰트에는 아무 것도 없습니다 (올바른 용어 인 경우).

도움을 주시면 감사하겠습니다.

답변

51

.query 대신 .value 기능을 사용해보십시오 :

SELECT 
    xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
FROM 
    LogTable 

XPath 식은 잠재적 노드의 목록을 반환 할 수 있으므로 첫 번째를 사용하는 SQL 서버에게 잠재 목록에 [1]를 추가해야 그 항목의 (그리고 예 - 그 목록은 1 기반 - 아니 0 기반). 두 번째 매개 변수로, 값을 변환해야하는 유형을 지정해야합니다. 여기서 추측 할 수 있습니다. 당신의 XML의 실제 구조에 따라 마크

+1

감사합니다. 정확히 내가 필요로하는 것. –

+0

내가 인덱스에 따라 읽을 수 있어요 당신의주고 쿼리를 사용하여 같은 분야에서 동적 노드를 가지고있다. 의미 인덱스를 1로 지정하면 2가 표시되고 인덱스 2를 지정하면 5가 표시되지만 두 노드가 모두 필요합니다. 그러니 제발 어떻게 저에게 제안 해주세요. – pixelbyaj

+0

이 값을 부울로 사용하는 데 문제가 있습니다. 두 번째 매개 변수로 'boolean'및 'System.Boolean'을 사용하여 오류가 발생했습니다. 만약 내가 varchar 않으면 모든 nulls를 반환합니다. 내 xml 줄은 다음과 같이 보입니다 : Zac

5

, '일반'SQL의 예를 들어 쉽게 사용하여 소비 할 수 있도록 그 위에보기를 넣어 유용 할 수 있습니다

CREATE VIEW vwLogTable 
AS 
SELECT 
    c.p.value('@name', 'varchar(10)') name, 
    c.p.value('@value', 'varchar(10)') value 
FROM 
    LogTable 
    CROSS APPLY x.nodes('/container/param') c(p) 
GO 


-- now you can get all values for paramB as... 
SELECT value FROM vwLogTable WHERE name = 'paramB' 
+0

왜 xmlCol.value ('(/ container/param [@ 이름 = "paramB"]/@ 값) [1]', 'varchar (50)'는 나를 위해 작동하지 않지만 .value ('@ value' , 'vharchar (50)') 작동합니까? 음. – AndyClaw

0

$doc/param[@value = "valueB"]/fn:data(@value)
$ doc에 Xml이 있다고 가정합니다.