xml 的数据类型在平常的开发也是很常用的,燃鹅。也是有一些地方需要留意。今天我就分享几个测试的例子。

使用 xquery.exist (有但不仅仅限于)的注意事项。通常使用来判断节点是否存在,值是否存在。常用例子是

DECLARE @xml XML = '
<Root>
<ID>1</ID>
<ID>2</ID>
</Root>
'
SELECT @xml.exist('Root/ID[text()=1]')
SELECT @xml.exist('Root/ID[text()=0]')

显然结果就是第一条就是1,第二条语句就是0。这是基本应用,也没有什么问题。

然后我们根据实际情况测试一下。比方说我们使用exist 来配对表里面的值,比如使用以下例子,将包含在xml节点的员工密码修改为默认123456

SET NOCOUNT ON;
DECLARE @T AS TABLE (
Staff NVARCHAR(50),
Age INT,
PSW VARCHAR(50)
) INSERT INTO @T
( Staff, Age, PSW )
VALUES ( 'Joe', 30,'JJJJJ' ),
( 'Mary',25,'KKK') DECLARE @Xml XML ='
<Staffs>
<Staff>Joe</Staff>
</Staffs>
' SELECT * FROM @T
UPDATE a SET PSW = ''
FROM @T a
WHERE @Xml.exist('Staffs/Staff[text()=sql:column("a.Staff")]') = 1
SELECT * FROM @T Staff Age PSW
-------------------------------------------------- ----------- --------------------------------------------------
Joe 30 JJJJJ
Mary 25 KKK Staff Age PSW
-------------------------------------------------- ----------- --------------------------------------------------
Joe 30 123456
Mary 25 KKK

这样看没有什么问题,因为测试用例都比较规范。但是如果变点花样就不一样了。比如说

SET NOCOUNT ON;
DECLARE @T AS TABLE (
Staff NCHAR(50), --只是将数据类型从NVarchar(50) 调整为 NChar(50)
Age INT,
PSW VARCHAR(50)
) INSERT INTO @T
( Staff, Age, PSW )
VALUES ( 'Joe', 30,'JJJJJ' ),
( 'Mary',25,'KKK') DECLARE @Xml XML ='
<Staffs>
<Staff>Joe</Staff>
</Staffs>
' SELECT * FROM @T
UPDATE a SET PSW = ''
FROM @T a
WHERE @Xml.exist('Staffs/Staff[text()=sql:column("a.Staff")]') = 1
SELECT * FROM @T

Staff Age PSW
-------------------------------------------------- ----------- --------------------------------------------------
Joe 30 JJJJJ
Mary 25 KKK


Staff Age PSW
-------------------------------------------------- ----------- --------------------------------------------------
Joe 30 JJJJJ
Mary 25 KKK

表里面的数据没有被更改,换句话来说用 xquery.exist 判断不了这种情况。原因好明确,就因为@T里面的Staff 实际上后面带了N多个空格嘛,所以和xml进行匹配就懵逼了。导致根本生成不了结果。

如果数据是这样的,不妨改一下方法,也可以实现修改的功能。下面的例子是先把xml里面的节点值先提取出来,再和数据库表变量进行一个比对,因为在默认情况下,数据库的比对会去除后面空格再进行比对。所以更新就可以成功了。

SET NOCOUNT ON;
DECLARE @T AS TABLE (
Staff NCHAR(50),
Age INT,
PSW VARCHAR(50)
) INSERT INTO @T
( Staff, Age, PSW )
VALUES ( 'Joe', 30,'JJJJJ' ),
( 'Mary',25,'KKK') DECLARE @Xml XML ='
<Staffs>
<Staff>Joe</Staff>
</Staffs>
' SELECT * FROM @T
;WITH CTE AS
(
SELECT t.c.value('.[text()]','Nvarchar(50)') Staff
FROM @Xml.nodes('Staffs/Staff') AS t(c)
)
UPDATE a SET PSW = ''
FROM @T a
WHERE EXISTS(SELECT * FROM CTE WHERE a.Staff = CTE.Staff)
SELECT * FROM @T

这个例子也告诉我们当遇到有些语句在查询有问题出不来的时候,多一个途径,看下是不是查询的方法和和本身数据是否不符合。也多一种检查的路子。

燃鹅关键还是要多练习一下下

xml类型使用注意事项的更多相关文章

  1. 批量处理sql 数据存入xml类型列

    个人记录 需求:当表T1 ItemCode和表T2 ItemName的数据相等时,将表T2所对应的ID和ItemName列的数据分别存入表T1 CAOZUO字段的id元素和text元素的文本中. 下面 ...

  2. Sql Server xml 类型字段的增删改查

    1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需 ...

  3. 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;

    http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...

  4. 【转】SQLServer XML类型

    SQL Server从2005起开始支持xml类型,这个数据类型对于后期的改变非常有用.一对多的关系在后期变成了多对多的关系,XML类型就是一个不错的选择. 1.创建测试数据 创建表 --创建表,包含 ...

  5. Ajax返回xml类型数据

    ajax可以返回文本类型数据和xml类型数据,xml是计算机通用语言 可以使用js解析返回xml类型数据的dom对象 前端页面 <!doctype html> <html lang= ...

  6. Sqlserver更新数据表xml类型字段内容某个节点值的脚本

    GO USE [JC2010_MAIN_DB] 1.新建备份表JobObjectVersion_JCSchemVersion_BCK) GO IF EXISTS (SELECT * FROM sys. ...

  7. SQLServer XML类型

    SQL Server从2005起开始支持xml类型,这个数据类型对于后期的改变非常有用.一对多的关系在后期变成了多对多的关系,XML类型就是一个不错的选择. 1.创建测试数据 创建表 --创建表,包含 ...

  8. C# Winform中执行post操作并获取返回的XML类型的数据

    /// <summary> /// 返回指定日期的订单数据 /// </summary> /// <param name="StartDate"> ...

  9. 【Loadrunner】初学Loadrunner——参数化设置(Xml类型)

    不是所有类型的参数都是和XML类型,只有一段标准的XML语句块,而且需要选中整个完整的XML语句块才可以使用XML的参数化.单个变量是不适合XML的参数化的.在选择的时候需要选中XML语句块的起始标签 ...

随机推荐

  1. Alcatraz 的安装和删除

    Xcode 所有的插件都安装在目录: ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 你也可以手工切换到这个目录来删除插件 ...

  2. 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.结构元素 可以理解为语义话标记,比如:以前这么写&l ...

  3. Log4net入门(控制台篇)

    Log4net是Apache公司的log4j™的.NET版本,用于帮助.NET开发人员将日志信息输出到各种不同的输出源(Appender),常见的输出源包括控制台.日志文件和数据库等.本篇主要讨论如何 ...

  4. C++服务器开发之笔记三

    为什么需要原子性操作? 我们考虑一个例子:(1)x++这个常见的运算符在内存中是怎样操作的?从内存中读x的值到寄存器中,对寄存器加1,再把新值写回x所处的内存地址 若是有两个线程同时对同一个变量++, ...

  5. 【NLP】基于自然语言处理角度谈谈CRF(二)

    基于自然语言处理角度谈谈CRF 作者:白宁超 2016年8月2日21:25:35 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  6. Oracle数据加载之外部表的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一. 创建外部表 1.1 创建外部表需要的目录 1.2 创建外部表 1.3 创建外部表源文件 1.4 查询外部表 二. 加载 ...

  7. Vertica 业务用户指定资源池加载数据

    之前在"Vertica 安装,建库,新建测试用户并授予权限,建表,入库"这篇文章也简单介绍过入库部分的内容. 但之前测试用例若用于生产环境有明显的局限性: 1.是用dbadmin管 ...

  8. 【Spring-web】RestTemplate源码学习——梳理内部实现过程

    2016-12-28 by 安静的下雪天  http://www.cnblogs.com/quiet-snowy-day/p/6228198.html  提示:使用手机浏览时请注意,图多费流量. 本篇 ...

  9. 用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...

  10. Moon.Orm 配置说明

    一.在线技术文档: http://files.cnblogs.com/files/humble/d.pdf   二.使用的大致流程   1.首先下载代码生成器,可以一键生成项目Model层;(其中含有 ...