2010-12-14 1 views
2

SQL Server 2005에서 XQuery를 사용하여 열에 저장된 XML을 업데이트하려고합니다. 다음은 업데이트해야하는 데이터의 샘플입니다.Xquery를 사용하여 xsi : nil = "true"인 노드 값 바꾸기

<Length>3</Length> 
<Width>5</Width> 
<Depth>6</Depth> 
<Area xsi:nil="true" /> 
<Volume xsi:nil="true" /> 

다른 테이블의 값으로 영역과 볼륨을 설정해야합니다. 업데이트를위한 CTE를 생성 중입니다. 이 내가 생략 한 다른 논리는,하지만 난 CTE 업데이트에 대한 올바른 데이터를 포함하고 있다는 것을 확인했다 :

;with Volume (DocumentID, Volume) As 
(
    Select DocumentID, Volume from tbl 
) 

나는 테이블을 업데이트하려고하려면 다음 XQuery를 SQL 문을 사용하고 있습니다.

UPDATE tbl_Archive 
    SET XML.modify(' declare namespace x="http://www.redacted.com"; 
    replace value of (/x:Document/x:Volume/text())[1] 
    with sql:column("Volume.Volume")') 
    From Volume where volume.documentID = tbl_Archive.DocumentID 

나는 영향을 1 개 행을 얻을 수 있지만, 나는 XML을 볼 때이 변경되지 않은, 나는 그것이 작동되도록 고정 될 필요가 무엇인지 알아낼 수 없습니다. 차이가 나는 경우 노드는 유형이 지정되지 않습니다.

답변

4

대체 할 텍스트가 없으면 업데이트가 작동하지 않습니다. XPath /x:Document/x:Volume/text())[1]은 빈 세트를 반환합니다.

UPDATE tbl_Archive 
    SET XML.modify(' declare namespace x="http://www.redacted.com"; 
    insert text {sql:column("Volume.Volume")} 
    as first into (/x:Document/x:Volume)[1]') 
    From Volume where volume.documentID = tbl_Archive.DocumentID 

이 ..you'll 다음 nil="true" 속성을 제거해야

시도 삽입 ... .. 어쩌면이 같은

뭔가 ..

update tbl_Archive set XML.modify('delete /*:Document/*:Volume[text()]/@xsi:nil') 
+0

그래,이했다 그것. 감사! –