2014-10-20 4 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

Извлечение Person узлов из @XMLChildData в отдельную переменную и добавить, что в Persons узел @XMLParentData.

DECLARE @PersonList XML 

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

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

SELECT @XMLParentData 

Другим способом является извлечение Person узлов из обеих переменных и восстановить Persons узел с помощью FOR XML PATH.

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

Извините ... вы правы. Спасибо Mikael – user3917837

Смежные вопросы