015_xml_函数
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_函数的更多相关文章
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- C++中的时间函数
C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...
随机推荐
- 《STL源码剖析》环境配置
首先,去侯捷网站下载相关文档:http://jjhou.boolan.com/jjwbooks-tass.htm. 这本书采用的是Cygnus C++ 2.91 for windows.下载地址:ht ...
- bzoj3043
这道题完全没想出来,引自 http://blog.csdn.net/willinglive/article/details/38419573的题解 对于带有“将一段区间内的每个数全部加上某个值”这种操 ...
- 【转】Any way to implement BLE notifications in Android-L preview----不错
原文网址:http://stackoverflow.com/questions/24865120/any-way-to-implement-ble-notifications-in-android-l ...
- 【最短路】【数学】CSU 1806 Toll (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1806 题目大意: N个点M条有向边,给一个时间T(2≤n≤10,1≤m≤n(n-1), ...
- bzoj2124 等差子序列(hash+线段树)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 719 Solved: 261[Submit][Status][Discuss] ...
- LeetCode--判断二叉树是否对称
主要是检查该二叉树是否是自己的一个镜像(也就是以中心轴对称的) 举例来说,下面显示的就是一个对称的二叉树 1 / \ 2 2 / \ / \ 3 4 4 3 下面显示的就不是一个对称的二叉树了 1 / ...
- J - A Bug's Life - poj2492
这个题目很有意思啊,有一些bug生物(肯定是程序员养的),有人观察他们的生活习惯,观察他们之间是否有同性恋关系,比如ab发生关系,bc发生关系,ab发生关系...产生了同性恋了,你需要判断一下这种关系 ...
- N - Tram - poj1847(简单最短路)
题意:火车从一点开到另一点,轨道上有很多岔路口,每个路口都有好几个方向(火车能够选任意一个方向开),但是 默认的是 第一个指向的方向,所以如果要选择别的方向的话得 进行一次切换操作 ,给定一个起点一个 ...
- [置顶] 【Git入门之十三】Ubuntu和git
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374291 之前我们都是在Windows平台下操作git.现在我们改用Ub ...
- Java 流的概述及操作(转)
一.什么是流? 流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由地控制文件.内存.IO设备等数据的流向. ...