문제

이 문제에 대한 배경을 먼저 제공하기 위해, 나는 현재 일부 XML을 통해 루프가있는 일부 코드를 다시 작성하고 각 루프 끝의 테이블에 삽입을 수행합니다. 가서 XML을 테이블에 '파쇄'하십시오.

메인 파쇄는 성공적으로 수행되었지만 현재 열 중 하나는 전체 노드를 저장하는 데 사용됩니다. 나는 이것 (거의)에 필요한 쿼리를 해결할 수 있었지만 노드의 루트 부분을 놓치게됩니다. 나는 내 쿼리가 내가 얻을 수있는만큼 좋다는 결론에 도달했으며, 루트 노드를 다시 가져 오기 위해 업데이트 명령문을 할 수있는 방법을 찾고 있습니다.

그래서 내 XML은 양식입니다.

<xml>
<Items>
<Item>
    <node1>...</node1><node2>..<node2>.....<noden>...<noden>
<Item>
<Item>
    <node1>...</node1><node2>..<node2>.....<noden>...<noden>
<Item>
<Item>
    <node1>...</node1><node2>..<node2>.....<noden>...<noden>
<Item>
......
<Items>
</xml>

따라서 기본 파쇄는 node1에서 node2에 value를 column2에 넣습니다. 삽입 문은 다음과 같습니다.

INSERT INTO mytable col1, col2,...etc.....,wholenodecolumn
Select  
doc.col.value('node1[1]', 'int') column1,
doc.col.value('node2[1]', 'varchar(50)') column2,
....etc......,
doc.col.query('*')--this is the query for getting the whole node
FROM @xml.nodes('//Items/Item') doc(col)

Wholenodecolumn에서 끝나는 XML은 형식입니다.

<node1>...</node1><node2>..<node2>.....<noden>...<noden>

그러나 나는 형식이어야합니다

<Item><node1>...</node1><node2>..<node2>.....<noden>...<noden></Item>

이 열의 XML에 따라 올바른 형식의 기존 코드 (많은 IT)가 있습니다.

누군가가 수정하는 방법을 볼 수 있습니다 doc.col.query('*') 원하는 결과를 얻으려면?

어쨌든, 나는 쿼리 수정을 포기하고 최종 결과를 달성하는 다른 방법을 생각하려고 노력했습니다. 내가 지금보고있는 것은 삽입 후 업데이트입니다.

update mytable set wholenodecolumn.modify('insert <Item> as first before * ')

내가 이것을 함께 할 수 있다면

 .modify('insert </Item> as last after * ')  

괜찮을 것 같지만 XML이 유효하지 않기 때문에 한 번에 1을 한 번에 수행하는 것은 옵션이 아닙니다.

XQuery [mytable.wholenodecolumn.modify()]: Expected end tag 'Item'  

그리고 둘 다 함께 할 수 있는지 모르겠지만 다양한 구문을 시도했지만 일을 할 수 없습니다.

문제에 대한 다른 접근 방식도 감사하게 받았습니다

도움이 되었습니까?

해결책 2

내 자신의 질문에 대답합니다! - 이것은 내가 말한 다른 시도 답변 중 하나에 이어 다음과 같이 말합니다.

나는 현재 쿼리에서 flwor xquery constructs를 조사하고 있습니다.
col.query('for $item in * return <Item> {$item} </item>') 거의 거기에 있지만 모든 노드 주변이 아닌 각 노드 주위에 넣습니다.

나는 구문을 거의 가지고 있었고, 작은 조정으로 내가 필요한 것을 주었다.

doc.col.query('<Item> { for $item in * return $item } </item>'

도움을 준 모든 분들께 감사드립니다. 지금은 추가 관련 문제가 있지만 별도의 질문으로 게시하겠습니다.

다른 팁

for 절을 사용하여 루트 노드 이름을 지정할 수 있습니다.

예를 들어:

select top 1 *
from HumanResources.Department
for XML AUTO, ROOT('RootNodeName')

자세한 내용은 온라인에서 책을 살펴보십시오.

http://msdn.microsoft.com/en-us/library/ms190922.aspx

선택의 고정 텍스트로 '' / ''를 추가 할 수 없습니까? 같은 것 :

Select  
  '<Item>',
  doc.col.value('node1[1]', 'int') column1,
  doc.col.value('node2[1]', 'varchar(50)') column2,
  ....etc......,
  doc.col.query('*'),
  '</Item>'      --this is the query for getting the whole node
FROM @xml.nodes('//Items/Item') doc(col)

마크

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top