• 转载---SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除


    /*------------------------------------------------------------------------------+
    #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : |
    #|{>/------------------------------------------------------------------------<}|
    #|: | Author : 小爱 |
    #|: | Description: XML modify() 方法 |
    #|: | SQL Version: 适用于 SQL 2005, SQL 2008 , SQL 2012 |
    #|: | Copyright : 转载请注明出处。更多请访问:http://blog.csdn.net/beirut |
    #|: | Create Date: 2012-11-22 |
    #|: | About Me : 一个菜鸟dba |
    #|{>------------------------------------------------------------------------/<}|
    #| = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : = : |
    #+-----------------------------------------------------------------------------*/


    /*------------------------------------------------------------------------------------------------------------------
    本章讲述 modify() 方法 , modify() 方法是使用 XML DML 语句在 XML 数据中插入、更新或删除节点。
    语法:modify (XML_DML) XML_DML 是 XML 数据操作语言 (DML) 中的字符串。
    XML DML 将下列区分大小写的关键字添加到 XQuery 中:
    insert --添加
    delete --删除
    replace value of --更新
    ------------------------------------------------------------------------------------------------------------------*/

    DECLARE @x XML
    SET @x='
    <root>
    <rogue id="001">
    <hobo id="1">
    <name>彪</name>
    <type>流氓</type>
    </hobo>
    </rogue>
    </root>'

    ------------------------------------------------------插入------------------------------------------------------------
    --在 hobo 节点下插入 一个新节点
    SET @x.modify('
    insert <nickname>阿彪</nickname>
    as first
    into (/root/rogue/hobo)[1]
    ');
    SELECT @x
    --注释:如果某节点下面有多个节点的时候可以使用 as first 或 as last 来指定所需的新节点添加位置。

    ---在指定的 hobo 节点下,插入同一级节点
    SET @x.modify('
    insert <id>1</id>
    before (/root/rogue/hobo)[1]
    ');
    SELECT @x
    --注释:是用 before 或者 after 关键字代替 into 在指定节点的 前面 或者 后面 插入同级节点
    --after 关键字 和 before 关键字不能用于插入属性

    --插入属性 一次插入多个属性值/使用变量/属性定位
    DECLARE @a INT =5
    SET @x.modify('
    insert (
    attribute a {sql:variable("@a")},
    attribute b {".5"}

    )
    into (/root/rogue/hobo[@id=1])[1]
    ');
    SELECT @x;
    GO
    ----------------------------------------------------删除------------------------------------------------------------
    DECLARE @x XML
    SET @x='
    <?Instructions for=TheWC.exe ?>
    <root>
    <rogue id="001">
    <hobo id="1" weight="80" age="25">
    <name>彪</name>
    <type>流氓</type>
    <nickname>阿彪</nickname>
    <notes />
    </hobo>
    <page_hotspots />
    </rogue>
    <notes />
    </root>'
    -- 删除属性
    SET @x.modify('
    delete /root/rogue/hobo/@id
    ')
    SELECT @x

    -- 删除节点
    SET @x.modify('
    delete /root/rogue/hobo/name[1]
    ')
    SELECT @x

    -- 删除节点内容
    SET @x.modify('
    delete /root/rogue/hobo/type/text()
    ')
    SELECT @x

    -- 删除所有处理指令
    SET @x.modify('
    delete //processing-instruction()
    ')
    SELECT @x

    -- 删除所有的内容为空的节点
    SET @x.modify('
    delete //*[empty(./*)]
    ')

    SELECT @x

    ----------------------------------------------------修改------------------------------------------------------------

    DECLARE @x XML
    SET @x='
    <root>
    <rogue id="001">
    <hobo id="1" weight="80" age="25">
    <name>彪</name>
    <type>流氓</type>
    <nickname>阿彪</nickname>
    </hobo>
    </rogue>
    </root>'
    -- 在修改语法当中 每次只能修改一个单个节点,不能批量修改或者一次修改多个值,这一点是比较郁闷的

    -- 修改节点值
    SET @x.modify('
    replace value of (/root/rogue/hobo/name/text())[1]
    with "光辉"
    ')
    SELECT @x

    -- 修改属性值
    SET @x.modify('
    replace value of (/root/rogue/hobo/@weight)[1]
    with "70"
    ')
    SELECT @x

    -- 使用 if 表达式
    SET @x.modify('
    replace value of (/root/rogue/hobo/@age)[1]
    with (
    if (count(/root/rogue/hobo/*) > 2) then
    "30"
    else
    "10"
    )
    ')
    SELECT @x

    ------------------------------------------------------一些示例------------------------------------------------------------

    -- 1
    DECLARE @x1 XML
    SELECT @x1 = '
    <rogue>
    <hobo name="彪"/>
    <hobo name="光辉"/>
    <hobo name="小D"/>
    <hobo name="野子"/>
    </rogue>'

    ------------------------------------------------------------
    -- 把 小D 移动到 彪 前面
    ------------------------------------------------------------
    SET @x1.modify('
    insert /rogue/hobo[@name="小D"]
    before (/rogue/hobo[@name="彪"])[1]
    ')

    SET @x1.modify ('
    delete (/rogue/hobo[@name="小D"])[2]
    ')

    SELECT @x1

    ---------- --------------------------------------------------
    -- 把 光辉 移动到 野子 后面
    ------------------------------------------------------------
    SET @x1.modify('
    insert /rogue/hobo[@name="光辉"]
    after (/rogue/hobo[@name="野子"])[1]
    ')

    SET @x1.modify ('
    delete (/rogue/hobo[@name="光辉"])[1]
    ')

    SELECT @x1

    ------------------------------------------------------------
    -- 把 野子 向前移动一级
    ------------------------------------------------------------
    SET @x1.modify('
    insert /rogue/hobo[@name="野子"]
    before (/rogue/hobo[. << (/rogue/hobo[@name="野子"])[1]])[last()]
    ')

    SET @x1.modify ('
    delete /rogue/hobo[@name="野子"]
    [. is (/rogue/hobo[@name="野子"])[last()]]
    ')

    SELECT @x1
    ------------------------------------------------------------
    -- 把 彪 向后 移一级
    ------------------------------------------------------------
    set @x1.modify('
    insert /rogue/hobo[@name="彪"]
    before (/rogue/hobo[. >> (/rogue/hobo[@name="彪"])[1]])[2]
    ')
    SELECT @x1
    SET @x1.modify ('
    delete (/rogue/hobo[@name="彪"])[1]
    ')

    SELECT @x1

    ------------------------------------------------------------
    -- 使用变量修改属性名称
    ------------------------------------------------------------
    DECLARE @x2 XML
    SELECT @x2 = '
    <Employees>
    <Employee FirstName="Jacob" MiddleName="V" LastName="Sebastian"/>
    </Employees>'

    DECLARE @var VARCHAR(20)
    DECLARE @val VARCHAR(20)

    SELECT @var = 'MiddleName'
    SELECT @val = 'J'


    SET @x2.modify('
    replace value of (
    /Employees/Employee/@*[local-name()=sql:variable("@var")]
    )[1]
    with sql:variable("@val")
    ')

    select @x2

    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    Rational Rose 2003 逆向工程转换C++ / VC++ 6.0源代码成UML类图
    用VC实现特定编辑框上对回车键响应
    22.职责链模式
    21.策略模式
    20.状态模式
    19.解释器模式
    18.备忘录模式
    17.中介者模式
    16.观察者模式
    15.迭代器模式
  • 原文地址:https://www.cnblogs.com/Frank99/p/5974488.html
Copyright © 2020-2023  润新知