学习之路十二:SQL Server操作XML以及遇到的问题
2012-05-09 19:05
513 查看
这几天项目业务需求需要对数据库中的一段XML进行操作,虽然以前看过几眼但是都忘记了,没印象了,所以这几天简简单单的学习了一下,于是把感悟与大家分享一下!
先吐槽一下,我总是对“create”和“declare”搞乱,昨天写存储过程直接写成“declare procedure P_GetInfo”这样的语句,结果执行报错了,找了有半个小时了还没有搞定,结果找Leader过来一看说你看看你定义存储过程的语法对不对,我愣了一下,惭愧了,人品弱爆了,以后不能粗心大意了,教训,不多说了,Let's go!
我XML的格式如下
[b]1.查询[/b]
①query(xquery)
有筛选和查询功能,最主要的还是筛选功能!
查找Button节点中属性“name”的值为15的需求:
注意“@”符号的使用,以及把你用于过滤属性的值用双引号括起来(建议都要加上,如果是int型的可以不要加),这些都是个语法规则!
查询的结果为:
last:查找Button最后一个节点,相当于xml上面的第十七个节点!
②value(xquery)
有获取属性值和获取节点值的功能!
★:获取节点中属性的值:
这样就能把查询XML第一个节点中的属性值!
Note:说明一下“[]”的作用,相当于索引器,不过它是从“1”开始的,如果我把“name”后面中括号填“1”(以上面的数据为例),查出来的值就为“1”,如果填“2”,值就为“2”,以此类推!
★:对节点中的属性值进行筛选
总结:对于“value”查询,虽然比较灵活,但局限性比较大,它只能对某一个节点进行筛选,而不是在xml下所有相同节点的筛选,所以在大多数的情况下使用“query”进行筛选是一个很好的选择
③exist
语法跟query类似,返回值为“1”或“0”,返回“1” → 存在,反之不存在!
[b]2.遇到的问题[/b]
项目需要对xml中节点的属性值进行过滤,而这些属性值都是动态指定的,一开始就采用下面的这种方式如:
采用的是嵌入参数的方式,但是一直报错,说必须输入的为一个“string”类型的字符串!
第一种方法:一种比较简单的方式,使用 → sql:variable("参数名"),但这种很少人知道,所以基本不会用,详细请看:SQL 中操作XML类型数据
第二种方法:最后还是使用拼接字符串的方式搞定的(leader教我的,o(︶︿︶)o )!
所以说拼接字符串在很大程度上解决了很多难题,不过拼接字符串比较头疼是单引号处理的问题,不懂的人要搞的累死才能写对,哎,我就是属于这种人!
关于XML的添加,删除,修改可以参考以下文章:
http://www.cnblogs.com/guopeng/archive/2009/12/11/1621527.html
/article/5629987.html
http://www.cnblogs.com/gcb999/archive/2012/04/05/2433498.html
/article/6658394.html
以同步至 → 程序猿个人文章目录索引 (一直更新中...)
先吐槽一下,我总是对“create”和“declare”搞乱,昨天写存储过程直接写成“declare procedure P_GetInfo”这样的语句,结果执行报错了,找了有半个小时了还没有搞定,结果找Leader过来一看说你看看你定义存储过程的语法对不对,我愣了一下,惭愧了,人品弱爆了,以后不能粗心大意了,教训,不多说了,Let's go!
我XML的格式如下
<Canvas name="" designWidth="640" designHeigh = "100" > <Button name="1" width="5" height="2" /> <Button name="2" width="5" height="2" /> <Button name="3" width="5" height="2" /> <Button name="4" width="3" height="2" /> <Button name="5" width="5" height="2" /> <Button name="6" width="3" height="2" /> <Button name="7" width="3" height="2" /> <Button name="8" width="4" height="2" /> <Button name="9" width="3" height="2" /> <Button name="10" width="4" height="2" /> <Button name="11" width="3" height="2" /> <Button name="12" width="5" height="2" /> <Button name="13" width="5" height="2" /> <Button name="14" width="5" height="2" /> <Button name="15" width="3" height="2" /> <Button name="16" width="3" height="2" /> <Button name="17" width="5" height="2" /> </Canvas >
[b]1.查询[/b]
①query(xquery)
有筛选和查询功能,最主要的还是筛选功能!
查找Button节点中属性“name”的值为15的需求:
--查找节点中的属性 --语法 → '路径(应该是绝对路径)[属性名 = "属性值"]' 等于 '/Canvas/Button[@name="45"]' --注意单引号和双引号的使用,注意“[]”的使用,应该是一种语法把! --Note:这样的方式只能查出当前节点中属性是否满足条件,不会返回所有 --应用场景:如果只是查找xml内部的话建议使用“query”进行查询 SELECT Configuration.query('Canvas/Button[@name="15"]') FROM devDTTSConfig //devDTTSConfig是我存储xml的数据表
注意“@”符号的使用,以及把你用于过滤属性的值用双引号括起来(建议都要加上,如果是int型的可以不要加),这些都是个语法规则!
查询的结果为:
<Button name="15" width="3" height="2" />
last:查找Button最后一个节点,相当于xml上面的第十七个节点!
SELECT Configuration.query('Canvas/Button[last()]') FROM devDTTSConfig
②value(xquery)
有获取属性值和获取节点值的功能!
★:获取节点中属性的值:
--查询xml中我所指定的属性值 --如果对节点中属性值的长度没有很好的把握的话,建议使用 → NVARCHAR(max) SELECT Configuration.value('(Canvas/Button/@name)[1]','NVARCHAR(4)') FROM devDTTSConfig SELECT Configuration.value('(Canvas/Button/@width)[1]','NVARCHAR(max)') FROM devDTTSConfig SELECT Configuration.value('(Canvas/Button/@height)[1]','NVARCHAR(max)') FROM devDTTSConfig
这样就能把查询XML第一个节点中的属性值!
Note:说明一下“[]”的作用,相当于索引器,不过它是从“1”开始的,如果我把“name”后面中括号填“1”(以上面的数据为例),查出来的值就为“1”,如果填“2”,值就为“2”,以此类推!
★:对节点中的属性值进行筛选
--如果要对xml中的数据进行筛选,可以先获取属性值再进行筛选 --应用场景:如果是通过xml条件查找其它数据可以实现“value”进行查询 SELECT * FROM devDTTSConfig WHERE Configuration.value('(Canvas/Button/@width)[1]','NVARCHAR(max)') = 5 //只会筛选xml中Button节点中的第一个节点 SELECT * FROM devDTTSConfig WHERE Configuration.value('(Canvas/Button/@name)[1]','NVARCHAR(max)') LIKE '%1%' SELECT * FROM devDTTSConfig WHERE Configuration.value('(Canvas/Button/@height)[1]','NVARCHAR(max)') > 211
总结:对于“value”查询,虽然比较灵活,但局限性比较大,它只能对某一个节点进行筛选,而不是在xml下所有相同节点的筛选,所以在大多数的情况下使用“query”进行筛选是一个很好的选择
③exist
语法跟query类似,返回值为“1”或“0”,返回“1” → 存在,反之不存在!
SELECT Configuration.exist('Canvas/Button[@height=2]') FROM devDTTSConfig
[b]2.遇到的问题[/b]
项目需要对xml中节点的属性值进行过滤,而这些属性值都是动态指定的,一开始就采用下面的这种方式如:
SELECT Configuration.query('Canvas/Button[@height="'+@height+'"]') FROM devDTTSConfig
采用的是嵌入参数的方式,但是一直报错,说必须输入的为一个“string”类型的字符串!
第一种方法:一种比较简单的方式,使用 → sql:variable("参数名"),但这种很少人知道,所以基本不会用,详细请看:SQL 中操作XML类型数据
SELECT Configuration.exist('Canvas/Button[@height= sql:variable("@height") ]') FROM devDTTSConfig
第二种方法:最后还是使用拼接字符串的方式搞定的(leader教我的,o(︶︿︶)o )!
所以说拼接字符串在很大程度上解决了很多难题,不过拼接字符串比较头疼是单引号处理的问题,不懂的人要搞的累死才能写对,哎,我就是属于这种人!
CREATE PROC [dbo].[sp_GetTsConfig] ( @buttonTypeNo NVARCHAR(10), @objectNo NVARCHAR(10) ) AS EXECUTE (' SELECT devDTTSConfig.ID, devDTTSConfig.TSConfigNumber, devDTTSConfig.ScreenName, devDTTSConfig.TSType, devDTTSConfig.[Template], devDTTSConfig.ViewAs, devDTTSConfig.[Language], devDTTSConfig.[Status], devDTTSConfig.UpUser, devDTTSConfig.UpDT, devDTTSConfig.Calc_No, T.configuration FROM ( SELECT ButtonTable.TSConfigNumber, ButtonTable.ButtonType AS configuration FROM ( SELECT TSConfigNumber, Configuration.query(''(/Canvas/Button[@buttonType="'+@buttonTypeNo+'"])'') AS ButtonType, Configuration.query(''(/Canvas/Button[@objectNo="'+@objectNo+'"])'') AS ButtonNumber FROM devDTTSConfig ) AS ButtonTable WHERE ButtonTable.ButtonType IS NOT NULL AND ButtonTable.ButtonNumber IS NOT NULL AND ButtonTable.ButtonType.value(''(/Button/@objectNo)[1]'', ''nvarchar(max)'') IS NOT NULL AND ButtonTable.ButtonNumber.value(''(/Button/@buttonType)[1]'', ''nvarchar(max)'') IS NOT NULL ) AS T INNER JOIN devDTTSConfig ON devDTTSConfig.TSConfigNumber = T.TSConfigNumber Order by devDTTSConfig.UpDT desc ')
关于XML的添加,删除,修改可以参考以下文章:
http://www.cnblogs.com/guopeng/archive/2009/12/11/1621527.html
/article/5629987.html
http://www.cnblogs.com/gcb999/archive/2012/04/05/2433498.html
/article/6658394.html
以同步至 → 程序猿个人文章目录索引 (一直更新中...)
相关文章推荐
- Elastic学习第一天遇到的问题以及添加的一些操作
- 本体(ontology)学习之我见——Jena操作本体遇到的问题
- 关于操作access遇到的问题以及解决办法
- 近期学习hadoop遇到的问题以及解决方法
- opencv3.3 级联分类器生成xml以及遇到的一些问题
- Android自定义XML属性以及遇到的命名空间的问题
- 【c语言学习笔记】指针数组和数组指针以及在做题的时候遇到的问题
- file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)
- 记录一下:Unity5.5.1和Android 交互学习以及遇到的问题
- 近期学习hadoop遇到的问题以及解决方法
- 学习Hadoop时遇到的问题以及解决方法
- 学习中遇到的问题以及解决方法
- Linux 学习一 搭建环境系列之三 linux搭建django 以及搭建django时遇到的各种问题
- python学习之路-7 模块configparser/xml/shutil/subprocess以及面向对象初级入门
- MapReduce(Hbase)学习笔记---初学遇到的问题以及解决办法
- Git学习 -- 远程操作遇到error: failed to push some refs to问题解决方法
- jquery学习第十番 选择器的一些要注意的问题以及DOM操作
- file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)
- cmake 学习之路 记录中间所遇到过的所有错误与问题的解决 <四>
- Ubuntu学习记录、遇到的问题以及解决办法