/*
Author: liangCK 小梁
Date : 2008-11-19
*/
示例一: 如在一个 10/20/30 /50/40/90的字符串当中.需要得到前N个”/”的字串,或得到前N个”/”的和.如上的字符串.如果得到前3个”/”的字符串.也就是10/20/30/,要得到前3个”/”的数的和,就是60.这样的操作在以前通常会写一个函数,然后循环记数得到前N个字符串或前N个数的和.现在使用xml query,这样的操作将变得简单
--生成测试数据
DECLARE @t TABLE(data varchar(50))
INSERT @t VALUES(' 10/20/30 /50/40/90')
INSERT @t VALUES(' 1/2/3 /5/4/9')
INSERT @t VALUES(' 10/5/60 /33/12/1')
INSERT @t VALUES(' 10/8/3 /60/55/20')
DECLARE @i int;
--得到前N项
SET @i=3
--1得到前N项的和
SELECT
CAST(('<root><v>'
+REPLACE(data,'/','</v><v>')
+'</v></root>'
) AS xml).query('
//v[position()<=sql:variable("@i")]').value('sum(v)','int')
FROM @t
/*
data
-----------
60
6
75
21
(4 行受影响)
原理:
将 10/20/30 /50/40/90生成一个
<root>
<v>10</v>
<v>20</v>
<v>30</v>
<v>50</v>
</root>
这样的数据
然后通过position()得到前几项.然后再通过sum进行求和
*/
--2.得到前N项的字符串
SELECT
CAST((CAST(('<root><v>'
+REPLACE(data,'/','</v><v>')
+'</v></root>'
)AS xml).query('
//v[position()<=sql:variable("@i")]').query('for $i in //v
return concat(string($i),"/")'))
AS varchar(30))
FROM @t
/*
原理跟上面的差不多
data
------------------------------
10/ 20/ 30 /
1/ 2/ 3 /
10/ 5/ 60 /
10/ 8/ 3 /
(4 行受影响)
*/
--示例二:对存储在数据库中的xml的某一个元素进行加密
/*
例如现在有一个这样的xml数据
<Persons>
<Person ID="123456">
<Name>小梁</Name>
<Age>20</Age>
<Address>广东中山市石岐区</Address>
<Zip>528400</Zip>
</Person>
</Persons>
*/
这样的一个xml数据.我需要对Address元素的text进行加密.而其它的可以显示供用户查看.
方法:通过xquery得到Address的元素值.然后再通过加密方法.(加密方法可以看我的另一文章