루트 노드를 추가하려면 SQL Server에서 XML을 수정하십시오.
-
05-07-2019 - |
문제
이 문제에 대한 배경을 먼저 제공하기 위해, 나는 현재 일부 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')
자세한 내용은 온라인에서 책을 살펴보십시오.
선택의 고정 텍스트로 '' / ''를 추가 할 수 없습니까? 같은 것 :
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)
마크