2014-10-20 2 views
2

기존 xml 부모 노드에 새 xml 자식 노드를 삽입하거나 추가 할 수있는 스크립트가 있어야합니다.SQL Server 부모 노드에 XML 자식 노드 추가

--New child nodes 
DECLARE @XMLChildData XML 
SET @XMLChildData = ' 
<Persons> 
    <Person> 
     <Firstname>Gary</Firstname> 
     <Surname>Smith</Surname> 
     <Telephone>0115547899</Telephone> 
     <Address> 
      <AddressLine>1 Church Lane</AddressLine> 
      <AddressLine>Rosebank</AddressLine> 
      <AddressLine>Houghton</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Wayne</Firstname> 
     <Surname>Farmey</Surname> 
     <Telephone>0117453269</Telephone> 
     <Address> 
      <AddressLine>51 Oak Street</AddressLine> 
      <AddressLine>Rivionia</AddressLine> 
      <AddressLine>Sandton</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Mark</Firstname> 
     <Surname>Jones</Surname> 
     <Telephone>0119854741</Telephone> 
     <Address> 
      <AddressLine>4 Arum Lane</AddressLine> 
      <AddressLine>Glen Hazel</AddressLine> 
      <AddressLine>Johannesburg</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
</Persons>' 

--Existing parent node 
DECLARE @XMLParentData XML 
SET @XMLParentData = ' 
<Persons> 
    <Person> 
     <Firstname>Sarah</Firstname> 
     <Surname>Gray</Surname> 
     <Telephone>0113265874</Telephone> 
     <Address> 
      <AddressLine>78 Emerl Aveune</AddressLine> 
      <AddressLine>Fourways</AddressLine> 
      <AddressLine>Sandton</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Jenna</Firstname> 
     <Surname>Reed</Surname> 
     <Telephone>0114781102</Telephone> 
     <Address> 
      <AddressLine>6 Park Lane</AddressLine> 
      <AddressLine>Parkhurst</AddressLine> 
      <AddressLine>Rosebank</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Mike</Firstname> 
     <Surname>Wilke</Surname> 
     <Telephone>0116532003</Telephone> 
     <Address> 
      <AddressLine>22 High Road</AddressLine> 
      <AddressLine>Modderfontein</AddressLine> 
      <AddressLine>Edenvale</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
</Persons>' 

나는 최종 결과이 원하는 :

<Persons> 
    <Person> 
     <Firstname>Sarah</Firstname> 
     <Surname>Gray</Surname> 
     <Telephone>0113265874</Telephone> 
     <Address> 
      <AddressLine>78 Emerl Aveune</AddressLine> 
      <AddressLine>Fourways</AddressLine> 
      <AddressLine>Sandton</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Jenna</Firstname> 
     <Surname>Reed</Surname> 
     <Telephone>0114781102</Telephone> 
     <Address> 
      <AddressLine>6 Park Lane</AddressLine> 
      <AddressLine>Parkhurst</AddressLine> 
      <AddressLine>Rosebank</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Mike</Firstname> 
     <Surname>Wilke</Surname> 
     <Telephone>0116532003</Telephone> 
     <Address> 
      <AddressLine>22 High Road</AddressLine> 
      <AddressLine>Modderfontein</AddressLine> 
      <AddressLine>Edenvale</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Gary</Firstname> 
     <Surname>Smith</Surname> 
     <Telephone>0115547899</Telephone> 
     <Address> 
      <AddressLine>1 Church Lane</AddressLine> 
      <AddressLine>Rosebank</AddressLine> 
      <AddressLine>Houghton</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Wayne</Firstname> 
     <Surname>Farmey</Surname> 
     <Telephone>0117453269</Telephone> 
     <Address> 
      <AddressLine>51 Oak Street</AddressLine> 
      <AddressLine>Rivionia</AddressLine> 
      <AddressLine>Sandton</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
    <Person> 
     <Firstname>Mark</Firstname> 
     <Surname>Jones</Surname> 
     <Telephone>0119854741</Telephone> 
     <Address> 
      <AddressLine>4 Arum Lane</AddressLine> 
      <AddressLine>Glen Hazel</AddressLine> 
      <AddressLine>Johannesburg</AddressLine> 
      <AddressLine>South Africa</AddressLine> 
     </Address> 
    </Person> 
</Persons> 

나는 내가 .modify()를 사용할 필요가 알고,하지만 난/APPEND 자식 노드를 통해 반복하고 삽입하는 방법을 잘 모르겠습니다 각 자식 "<person>" 부모 노드에 "<persons>" 노드.

가 나는

SET @XMLParentData.modify(' 
    insert  
     (
      sql:variable("@XMLChildData") 
     ) 
    after 
     (/Person[1]/Person[1]) 
') 

SELECT @XMLData 

답변

4

별도의 변수에 @XMLChildData에서 Person 노드를 추출하고 @XMLParentDataPersons 노드가 추가 아래로 비슷한 무언가를 할 필요가있다 생각합니다.

DECLARE @PersonList XML 

SET @PersonList = @XMLChildData.query('Persons/*') 

SET @XMLParentData.modify('insert sql:variable("@PersonList") as last into /Persons[1]') 

SELECT @XMLParentData 

또 다른 방법은 두 변수의 Person 노드를 추출하고 FOR XML PATH를 사용하여 Persons 노드를 다시 작성하는 것입니다. 내가 첫 번째 코드를 가지고가는 경우에

SET @XMLParentData = (
        SELECT @XMLParentData.query('/Persons/Person'), 
          @XMLChildData.query('/Persons/Person') 
        FOR XML PATH(''), ROOT('Persons'), TYPE 
        ) 
+0

감사 미카엘, 나는 내가 부모 목록에 자식 노드에서 목록을 추가 할 것으로 보인다 있었다 Bummi 제안과 같은 문제가 있습니다. 루트 노드가 인 부모 xml 만 갖고 부모 xml에 자식 xml의 노드 만 추가하고 싶습니다. 두 번째 코드 스 니펫을 가져 가면 예상대로 작동합니다. 첫 번째 코드 스 니펫으로 어떻게 필요한 결과를 얻을 수 있습니까? 내가 뭘 잘못했는지 이해하고 싶기 때문에 나 자신을 더 잘할 수 있습니다. – user3917837

+1

@ user3917837 첫 번째 예상대로 작동합니다. 아마도'sql : variable'에서 사용하는 변수를 변경하는 것을 잊었을 것입니다. 이 [SQL Fiddle] (http://sqlfiddle.com/#!3/d41d8/40302)을 살펴보십시오. –

+0

죄송합니다 ... 당신이 맞습니다. 고마워요 미카엘 – user3917837

관련 문제