SQL Server将XML子节点附加到父节点 [英] SQL Server append XML child nodes to parent node

查看:99
本文介绍了SQL Server将XML子节点附加到父节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要有一个脚本,该脚本可以将新的xml子节点插入/追加到已有的xml父节点中。

I need to have a script which can insert / append new xml child nodes to a pre-existing xml parent node.

--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(),但是我不确定如何遍历子节点并将每个子< person> 节点插入/附加到父< persons>

I know i need to use the .modify(), however i am not sure how to iterate through the child nodes and insert / append each child "<person>" node into the parent "<persons>" node.

我认为这需要与以下类似

I would think it would need to be something similiar as below

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

SELECT @XMLData


推荐答案

从@XMLChildData中提取 Person 节点到一个单独的变量中,并将其添加到 @XMLParentData 的>人节点。

Extract the Person nodes from @XMLChildData to a separate variable and add that to the Persons node of @XMLParentData.

DECLARE @PersonList XML

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

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

SELECT @XMLParentData

另一种方法是从两个变量中提取 Person 节点,并使用<$ c $重建 Persons 节点c> FOR XML路径。

Another way is to extract the Person nodes from both variables and rebuild the Persons node using FOR XML PATH.

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

这篇关于SQL Server将XML子节点附加到父节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆