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

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

  1. DECLARE @xml XML = '
  2. <Root>
  3. <ID>1</ID>
  4. <ID>2</ID>
  5. </Root>
  6. '
  7. SELECT @xml.exist('Root/ID[text()=1]')
  8. SELECT @xml.exist('Root/ID[text()=0]')

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

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

  1. SET NOCOUNT ON;
  2. DECLARE @T AS TABLE (
  3. Staff NVARCHAR(50),
  4. Age INT,
  5. PSW VARCHAR(50)
  6. )
  7.  
  8. INSERT INTO @T
  9. ( Staff, Age, PSW )
  10. VALUES ( 'Joe', 30,'JJJJJ' ),
  11. ( 'Mary',25,'KKK')
  12.  
  13. DECLARE @Xml XML ='
  14. <Staffs>
  15. <Staff>Joe</Staff>
  16. </Staffs>
  17. '
  18.  
  19. SELECT * FROM @T
  20. UPDATE a SET PSW = ''
  21. FROM @T a
  22. WHERE @Xml.exist('Staffs/Staff[text()=sql:column("a.Staff")]') = 1
  23. SELECT * FROM @T
  24.  
  25. Staff Age PSW
  26. -------------------------------------------------- ----------- --------------------------------------------------
  27. Joe 30 JJJJJ
  28. Mary 25 KKK
  29.  
  30. Staff Age PSW
  31. -------------------------------------------------- ----------- --------------------------------------------------
  32. Joe 30 123456
  33. Mary 25 KKK

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

  1. SET NOCOUNT ON;
  2. DECLARE @T AS TABLE (
  3. Staff NCHAR(50), --只是将数据类型从NVarchar(50) 调整为 NChar(50)
  4. Age INT,
  5. PSW VARCHAR(50)
  6. )
  7.  
  8. INSERT INTO @T
  9. ( Staff, Age, PSW )
  10. VALUES ( 'Joe', 30,'JJJJJ' ),
  11. ( 'Mary',25,'KKK')
  12.  
  13. DECLARE @Xml XML ='
  14. <Staffs>
  15. <Staff>Joe</Staff>
  16. </Staffs>
  17. '
  18.  
  19. SELECT * FROM @T
  20. UPDATE a SET PSW = ''
  21. FROM @T a
  22. WHERE @Xml.exist('Staffs/Staff[text()=sql:column("a.Staff")]') = 1
  23. SELECT * FROM @T
  24.  

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

  1.  

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

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

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

  1. SET NOCOUNT ON;
  2. DECLARE @T AS TABLE (
  3. Staff NCHAR(50),
  4. Age INT,
  5. PSW VARCHAR(50)
  6. )
  7.  
  8. INSERT INTO @T
  9. ( Staff, Age, PSW )
  10. VALUES ( 'Joe', 30,'JJJJJ' ),
  11. ( 'Mary',25,'KKK')
  12.  
  13. DECLARE @Xml XML ='
  14. <Staffs>
  15. <Staff>Joe</Staff>
  16. </Staffs>
  17. '
  18.  
  19. SELECT * FROM @T
  20. ;WITH CTE AS
  21. (
  22. SELECT t.c.value('.[text()]','Nvarchar(50)') Staff
  23. FROM @Xml.nodes('Staffs/Staff') AS t(c)
  24. )
  25. UPDATE a SET PSW = ''
  26. FROM @T a
  27. WHERE EXISTS(SELECT * FROM CTE WHERE a.Staff = CTE.Staff)
  28. 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. ABP框架 - 功能管理

    文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...

  2. 分段二次插值——用Python进行数值计算

    事实上在实际使用中,高次插值显然是很不适合的,高次插值将所有样点包涵进一个插值函数中,这是次幂高的原因.高次计算复杂,而且刚开始的一点误差会被方的很大.因此将整个区间分为若干个小区间,在每一个小区间进 ...

  3. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

  4. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  5. JavaScript随笔8

    正则表达式: search(a);//查询a的位置 substring(2,5)//获取到2到4位 chartAt(3);//获取到第3位 split('-');//以-切分 (1) RegExp对象 ...

  6. 【.net深呼吸】WPF异步加载大批量图像

    如何在WPF中加载大批量数据,并且不会阻塞UI线程,尤其是加载大量图片时,这活儿一直是很多朋友都相当关注的.世上没有最完美的解决之道,咱们但求相对较优的方案. 经过一些试验和对比,老周找到了一种算是不 ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①

    系列目录 系统需要越来越自动化,我们需要引入日志记录和异常捕获管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的.系统的异常需要被捕获,而不是将系统出错显示 ...

  8. 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

    文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html 系列目录 前言: 导入导出实在多例子,很多成熟的组建都分装了 ...

  9. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  10. 使用WordPress搭建自己的博客

    突然间发现自己在阿里上有一个免费的虚拟云空间,好像是什么时候阿里云搞活动赠送的.看了看还有不少时间,就决定自己搭建一个博客系统.说到搭建自己的博客,第一时间就想到WordPress,这个用起来应该是最 ...