zoukankan      html  css  js  c++  java
  • 转载---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

    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/Frank99/p/5974488.html
Copyright © 2011-2022 走看看