015_xml_函数

--环境准备*******************************************************************

USE test

--f:/test_xml.XML 【文件格式为UTF-8】

/*

<?xml version="1.0" encoding="gb2312"?>

<bookstore>

<book category="COOKING">

<title lang="en">Everyday Italian</title>

<author>Giada De Laurentiis</author>

<year>2005</year>

<price>30.00</price>

</book>

<book category="CHILDREN">

<title lang="jp">Harry Potter</title>

<author>J K. Rowling</author>

<year>2005</year>

<price>29.99</price>

</book>

<book category="WEB">

<title lang="en">XQuery Kick Start</title>

<author>James McGovern</author>

<author>Per Bothner</author>

<author>Kurt Cagle</author>

<author>James Linn</author>

<author>Vaidyanathan Nagarajan</author>

<year>2003</year>

<price>49.99</price>

</book>

<book category="WEB">

<title lang="cn">Learning XML</title>

<author>Erik T. Ray</author>

<year>2003</year>

<price>39.95</price>

</book>

</bookstore>

*/

--创建测试表

CREATE TABLE test_xml(id UNIQUEIDENTIFIER,tp XML)

--插入数据

INSERT INTO test_xml

SELECT NEWID()

,N'<ROOT>

<Customers CustomerID="XYZAA" ContactName="Joe" CompanyName="Company1">

<Orders CustomerID="XYZAA" OrderDate="2000-08-25T00:00:00"/>

<Orders CustomerID="XYZAA" OrderDate="2000-10-03T00:00:00"/>

</Customers>

<Customers CustomerID="XYZBB" ContactName="Steve"

CompanyName="Company2">No Orders yet!

</Customers>

</ROOT>'

UNION ALL

SELECT NEWID()

,* FROM OPENROWSET(BULK 'f:/test_xml.xml',SINGLE_BLOB) a

SELECT * FROM test_xml WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58' FOR XML PATH,ELEMENTS

--一.query() 方法*******************************************************************

--取 category="COOKING" 的book节点及其以下所有节点  【<book category="COOKING">】

SELECT tp.query('/bookstore/book[@category="COOKING"]') xml

FROM test_xml WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--取 author="Giada De Laurentiis" 的book节点及其以下所有节点  【<author>Giada De Laurentiis</author>】

SELECT tp.query('/bookstore/book[author="Giada De Laurentiis"]') xml

FROM test_xml WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--取title的所有节点,无论title在哪一级

SELECT tp.query('//title') xml FROM test_xml WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--二.exist() 方法 *******************************************************************

--【 用来判断 XQuery 表达式返回的结果是否为空 】

/*

1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。即,它至少返回一个 XML 节点。

0,表示 False(如果它返回一个空结果)。

NULL(如果执行查询的 xml 数据类型实例包含 NULL)。

*/

--查看路径下的元素或属性值是否存在

SELECT tp.exist('/bookstore/book[@category="COOKING"]')

FROM test_xml

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--三.value() 方法*******************************************************************

-- 【需要指明两个参数,一个为xquery, 另一个为得到数据的类型】【区分大小写】

--查询第三个title的值

SELECT tp.value('(/bookstore/book/title)[3]','nvarchar(max)') xml

FROM test_xml

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--Orders/@CustomerID,其中CustomerID是Orders的元素属性,而不是下一级元素

SELECT tp.value('(/ROOT/Customers/Orders/@CustomerID)[1]','nvarchar(max)') xml

FROM test_xml

WHERE id=N'A9CDA489-78A7-48C8-AF24-03648CD81F9A'

--四.notes() 方法 *******************************************************************

--【输入为XQuery表达式,返回一个XML格式文档的一列行集】

SELECT #T.c.query('.') FROM test_xml

cross apply tp.nodes('/bookstore/book[1]') as #T(c)

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

SELECT #T.c.value('(./title)[1]','nvarchar(max)') FROM test_xml

cross apply tp.nodes('/bookstore/book') as #T(c)

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--五.modify() 方法*******************************************************************

--Ⅰ,插入 insert---------------------------------------------

--into  默认插入到最后

update test_xml

SET tp.modify('insert <test>liwz_01</test>

into (/bookstore/book)[1]')

WHERE tp.exist('/bookstore/book/title[@lang="en"]')=1

--as first--as last

update test_xml

SET tp.modify('insert <test>liwz_02</test>

as first

into (/bookstore/book)[1]')

--before--after

update test_xml

SET tp.modify('insert <test>liwz_04</test>

before (/bookstore/book/year)[1]')

--查询

SELECT * FROM test_xml WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58' FOR XML PATH,ELEMENTS

--Ⅱ,删除 delete---------------------------------------------

UPDATE test_xml

SET tp.modify('delete /bookstore/book[@category="COOKING"]/test[1]')

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--Ⅲ,替换 replace ---------------------------------------------

--[1]放到右括号外面

UPDATE test_xml

SET tp.modify('replace value of (/bookstore/book/title/@lang)[1]

with "test_replace" ')

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

UPDATE test_xml

SET tp.modify('replace value of (/bookstore/book/test)[1]

with <test>test_replace</test> ')

WHERE id=N'4273465F-11DA-42C9-A457-E1ABAEE0CE58'

--注意:

--1.OPENROWSET(BULK 'f:/test_xml.xml',SINGLE_BLOB)

--将 【f:/test_xml.XML】 调整为UTF-8时,传输到sqlserver中才不是乱码

--2.T-SQL XQuery包含如下函数

/**

query(XPath条件):  结果为 xml 类型; 返回由符合条件的节点组成的非类型化的 XML 实例

value(XPath条件,数据类型):结果为指定的标量值类型; xpath条件结果必须唯一

exist(XPath条件):结果为布尔值; 表示节点是否存在,如果执行查询的 XML 数据类型实例包含NULL则返回NULL

nodes(XPath条件): 返回由符合条件的节点组成的一行一列的结果表

*/

--3.区分大小写

OPENROWSET

OPENXML

FOR XML

015_xml_函数的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

随机推荐

  1. codeforces C. Prime Swaps

    题意:给你n个数,然后在交换次数小于等于5×n的情况下使得这个序列变成升序,输出次数; 思路:哥德巴赫猜想:任何一个大于5的数都可以写成三个质数之和.尽可能的找大的素数,从1的位置向右逐步的调整,每一 ...

  2. 关于form.item不兼容的问题

    form.item()能在IE下运行,在firefox中会报脚本错误,没有这个函数. 可以使用 Form.elements 方法得到 HTMLCollection 后再使用 item 方法获取表单内元 ...

  3. Maven实战七

    转载:http://www.iteye.com/topic/973166 前言 Maven,发音是[`meivin],"专家"的意思.它是一个很好的项目管理工具,很早就进入了我的必 ...

  4. 【HDOJ】2369 Broken Keyboard

    字符串. #include <cstdio> #include <cstring> ]; ]; int main() { int n, len; int i, j, k, tm ...

  5. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  6. 【转】java中byte数组与int类型的转换(两种方式)----不错

    原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...

  7. C++递归求解N个元素的所有子集

    C++递归求解N个元素的所有子集 引言: 我在复习C++遇到了设计递归函数的问题.这个例子,很好的显示了设计递归的方式,思想. 这与斐波那数列不同,这个例子更有应用意义. 问题: 试编写一个递归函数, ...

  8. FATE(完全背包)

    /* http://acm.hdu.edu.cn/showproblem.php?pid=2159 分析: 和普通的完全背包没有什么太大的区别 但是题目中给出了限制最多可杀s个怪 用二维数组dp[i] ...

  9. [Sequence Alignment Methods] Cross-Recurrent Plot (CRP)

    A recurrence plot (RP) is a straightforward way to visualize characteristics of similar system state ...

  10. <一>初探js特效魅力之全选不选反选04

    初探js特效魅力04 我们在进入到公司里面工作的时候,做一个同一个项目,经常是大家分工合作,当我们写css时,一般不写在行间,因为这样会被误操作,也就是被乱删了都不知道,这样的后果是很难检查的 ,因为 ...