SQL操作XML
前面一段时间为了赶项目的进度,一直在加班,现在空闲了下来将前面碰到的问题整理了一下,发现了一些十分有用的,在此记录下来,看能不能帮助到遇到同样问题的朋友,此文仅是自己个人的意见,若存在问题,还望不宁赐教。
在项目中,我们时候会遇到一些诸如一次性提交许多数据的时候,从惯性思维上来讲,我们首先想到的是循环。但是在此存在一个问题,若数据很多的时候,当前用户操作之后,会一直停留在当前页面,直到提交完成之后才能进行其他的操作,这样对于用户的体验度不好,同时对于程序和数据库之间产生了压力。这时对于我们来说,就急需的要找一个来替代好的方式来替代此方法。经过对他们的请教,发现了一次性提交数据的方式,那就是讲数据以xml的形式进行提交。这样只进行一次提交而完成了所以数据的操作。但是可能这会给数据库带来一定的压力,目前为止,自己还未想到更好的办法,希望有更好的方式我们大家能进行分享,下面若有错的地方,还请大家提出。
在sql中,数据类型相信大家都是十分的 清楚,总共有25种。通常我们也常使用其中对应的。但是对于xml好像自己却是没看到,下面就是一些对于xml的一些常用的操作:
1.在程序中将数据进行xml的拼接,在此适自己情况而定,我当前情况是如此的
DECLARE @Xml xml='
<Rates value = "99" OperationUserID="110">
<Rate>
<Name last="a">aaa</Name>
<UserID>126</UserID>
</Rate>
<Rate>
<Name last="b">bbb</Name>
<UserID>125</UserID>
</Rate>
<Rate>
<Name last="c">ccc</Name>
<UserID>123</UserID>
</Rate>
<Rate>
<Name last="d">ddd</Name>
<UserID>124</UserID>
</Rate>
</Rates>'
首先从根节点看下来,先获取当前根节点上的属性
SELECT @Xml.value('(/Rates/@value)[1]','int') AS Value ,@Xml.value('(/Rates/@OperationUserID)[1]','int') AS OperationUserID
然后从根节点看下来,获取根节点下面的节点信息
SELECT T.c.value('Name[1]','varchar(20)')
,T.c.value('UserID[1]','int')
,T.c.value('(Name[1]/@last)[1]','varchar(20)')
FROM @Xml.nodes('/Rates/Rate') T(c)
接下来的就是你取出数据之后,对数据进行的操作了,在这里我就不在献丑了,视自己的情况而定吧。
在此只列出了我在项目中遇到的情况,相信还有其他的一些方式,希望能有这方面兴趣的朋友,我们能共同的分享。有什么错的地方,还望指出。