xml类型使用注意事项
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类型使用注意事项的更多相关文章
- 批量处理sql 数据存入xml类型列
个人记录 需求:当表T1 ItemCode和表T2 ItemName的数据相等时,将表T2所对应的ID和ItemName列的数据分别存入表T1 CAOZUO字段的id元素和text元素的文本中. 下面 ...
- Sql Server xml 类型字段的增删改查
1.定义表结构 在MSSM中新建数据库表CommunicateItem,定义其中一个字段ItemContentXml 为xml类型 2.编辑表数据,新增一行,发现xml类型不能通过设计器录入数据. 需 ...
- 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;
http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...
- 【转】SQLServer XML类型
SQL Server从2005起开始支持xml类型,这个数据类型对于后期的改变非常有用.一对多的关系在后期变成了多对多的关系,XML类型就是一个不错的选择. 1.创建测试数据 创建表 --创建表,包含 ...
- Ajax返回xml类型数据
ajax可以返回文本类型数据和xml类型数据,xml是计算机通用语言 可以使用js解析返回xml类型数据的dom对象 前端页面 <!doctype html> <html lang= ...
- Sqlserver更新数据表xml类型字段内容某个节点值的脚本
GO USE [JC2010_MAIN_DB] 1.新建备份表JobObjectVersion_JCSchemVersion_BCK) GO IF EXISTS (SELECT * FROM sys. ...
- SQLServer XML类型
SQL Server从2005起开始支持xml类型,这个数据类型对于后期的改变非常有用.一对多的关系在后期变成了多对多的关系,XML类型就是一个不错的选择. 1.创建测试数据 创建表 --创建表,包含 ...
- C# Winform中执行post操作并获取返回的XML类型的数据
/// <summary> /// 返回指定日期的订单数据 /// </summary> /// <param name="StartDate"> ...
- 【Loadrunner】初学Loadrunner——参数化设置(Xml类型)
不是所有类型的参数都是和XML类型,只有一段标准的XML语句块,而且需要选中整个完整的XML语句块才可以使用XML的参数化.单个变量是不适合XML的参数化的.在选择的时候需要选中XML语句块的起始标签 ...
随机推荐
- MailKit---状态更改和删除
当我们拉取邮件列表,并展示邮件后需要打开邮件,同时标识本邮件状态为已读状态,或者我们直接删除邮件.下面介绍基本的应用. 首先了解邮件的所有枚举状态:MailKit.MessageFlags包括:(No ...
- JavaScript随笔7
BOM (1). window.open('窗口','_self或者_blank');//打开一个新的浏览器窗口 例 var win = window.open('about:blank');//获取 ...
- 在SQL Server中为什么不建议使用Not In子查询
在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下 下面 ...
- 【原创经验分享】JQuery(Ajax)调用WCF服务
最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...
- 用枚举enum替代int常量
枚举的好处: 1. 类型安全性 2.使用方便性 public class EnumDemo { enum Color{ RED(3),BLUE(5),BLACK(8),YELLOW(13),GREEN ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- mac linux rename命令行批量修改文件名
我的mac使用命令行批量修改名字时发现居然没有rename的指令: zsh: command not found: rename 所以使用HomeBrew先安装一下: ➜ ~ brew install ...
- jQuery2.x源码解析(设计篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...
- 设置eclipse中自动添加get,set的注释为字段属性的注释
一:说明 首先具体来看一下是什么效果,上图可能会更清楚一点 就是在get/set中自动加上属性的注释,那我们要怎么配置呢? 二:配置 2.1:下载附件 下载附件 2.2:替换class 原生的ecli ...
- Basic Tutorials of Redis(5) - Sorted Set
The last post is mainly about the unsorted set,in this post I will show you the sorted set playing a ...