sql 2005 XQuery 对 xml 的操作?

guoweijun394 2007-12-10 03:14:40
<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<anyType xmlns:q1="http://microsoft.com/wsdl/types/" xsi:type="q1:guid">7a892bf3-059c-4675-a11f-bea56a813d8d</anyType>
<anyType xmlns:q2="http://microsoft.com/wsdl/types/" xsi:type="q2:guid">25855649-c6cb-47c3-a978-c49873f3b7e6</anyType>
</ArrayOfAnyType>
这个表里某字段存的是User ID集合,是xml表示,
我想通过这个表的ID,取出User 表对应的记录,应该怎么做? 如:25855649-c6cb-47c3-a978-c49873f3b7e6 对应的user记录。

不想从数据库中取出ID集合 再去取user对象集合。想直接在一个存储过程中完成。谢谢~!
...全文
332 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2007-12-10
  • 打赏
  • 举报
回复
更良好的写法,应该是这样


DECLARE @x XML
SELECT @x='<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<anyType xmlns:q1="http://microsoft.com/wsdl/types/" xsi:type="q1:guid"> 7a892bf3-059c-4675-a11f-bea56a813d8d </anyType>
<anyType xmlns:q2="http://microsoft.com/wsdl/types/" xsi:type="q2:guid"> 25855649-c6cb-47c3-a978-c49873f3b7e6 </anyType>
</ArrayOfAnyType>'
DECLARE @t TABLE
(id VARCHAR(100),v VARCHAR(100))
INSERT @t SELECT 'asdfasdfasdf','aaa'
UNION ALL SELECT 'ddadfasdfasdf','bbb'
UNION ALL SELECT '25855649-c6cb-47c3-a978-c49873f3b7e6','ccc'

SELECT a.* FROM @t a
INNER JOIN
@x.nodes('//anyType') AS t(tid)
ON RTRIM(LTRIM(CAST(tid.query('./text()') AS VARCHAR(100))))=id
guoweijun394 2007-12-10
  • 打赏
  • 举报
回复
谢谢~!
fcuandy 2007-12-10
  • 打赏
  • 举报
回复
DECLARE @x XML
SELECT @x='<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<anyType xmlns:q1="http://microsoft.com/wsdl/types/" xsi:type="q1:guid"> 7a892bf3-059c-4675-a11f-bea56a813d8d </anyType>
<anyType xmlns:q2="http://microsoft.com/wsdl/types/" xsi:type="q2:guid"> 25855649-c6cb-47c3-a978-c49873f3b7e6 </anyType>
</ArrayOfAnyType>'
DECLARE @t TABLE
(id VARCHAR(100),v VARCHAR(100))
INSERT @t SELECT 'asdfasdfasdf','aaa'
UNION ALL SELECT 'ddadfasdfasdf','bbb'
UNION ALL SELECT '25855649-c6cb-47c3-a978-c49873f3b7e6','ccc'

SELECT * FROM @t WHERE CHARINDEX(CHAR(32) + id + CHAR(32),CHAR(32) + CAST(@x.query('//anyType/text()') AS VARCHAR(8000)) + CHAR(32))>0
/*
id v
25855649-c6cb-47c3-a978-c49873f3b7e6 ccc
*/
guoweijun394 2007-12-10
  • 打赏
  • 举报
回复
<anyType xmlns:q1="http://microsoft.com/wsdl/types/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="q1:guid">7a892bf3-059c-4675-a11f-bea56a813d8d</anyType>
<anyType xmlns:q2="http://microsoft.com/wsdl/types/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="q2:guid">25855649-c6cb-47c3-a978-c49873f3b7e6</anyType>

怎么用sql 写 取出 25855649-c6cb-47c3-a978-c49873f3b7e6 这些值呢??
guoweijun394 2007-12-10
  • 打赏
  • 举报
回复
还是没写出来 @x 是怎么定义出来的 ,怎么遍历这个 GUID 集合呢?
dawugui 2007-12-10
  • 打赏
  • 举报
回复
SQL Server中用XQuery分解XML数据
本文讨论SQL Server 2005的新功能,它允许你将XML数据分解到关系格式中,而不必耗用太多内存。

在举例说明如何分解上一篇文章中的数据时,我们首先了解一下XQuery和它在SQL Server 2005中为开发者提供的功能。

XQuery介绍

XQuery,也称作XML Query,是一种查询XML数据的语言,允许你提取所需的节点和元素。它由W3C定义,可用于今天的大多数主流数据库引擎中,如Oracle、DB2和SQL Server。

SQL Server 2005 XQuery函数

下面的四个函数是SQL Server 2005中的XQuery函数。(注意,XML、XQuery语句和下面的函数都区分大小写。例如,SQL编译器接受XML数据中的.exist,但拒绝.EXIST或.Exist。)


xml.exist

这个方法根据一个XML节点上的搜索表达式返回一个布尔值。例如,列表A中XML代码片段中的语句将返回1(真):


SELECT @x.exist('/christmaslist/person[@gift = "socks"]')

这个语句返回0(假):


SELECT @x. exist ('/christmaslist/zach')

由于“Socks”一词被封套,这个语句将返回0(假)。


SELECT @x.exist('/christmaslist/person[@gift = "socks"]')

xml.value

这个方法接受一个XQuery语句并返回一个单独值。使用列表A中同样的XML代码片段,不可以使用VALUE函数生成“betty”值,如下所示:


SELECT @x.value('/christmaslist[1]/person[1]/@name', 'VARCHAR(20)')

而XQuery生成“zach”值。


SELECT @x.value('/christmaslist[1]/person[2]/@name', 'VARCHAR(20)')

xml.query

这个方法接受一个XQuery并返回一个XML数据类型的实例。可以按需要将这些查询简单或复杂化,下面是一个简单的例子:


SELECT @x.query('/christmaslist/person')

它返回XML文件:


<person name="betty" gift="camera" />

<person name="zach" gift="elmo doll" />

<person name="brad" gift="socks" />

xml.nodes

在你需要将一个XML数据类型变量中的数据分解到关系数据中时,这个方法十分有用。这个方法接受一个XQuery语句作为参数,并返回一个包含XML变量逻辑标量数据的行集。列表B中的查询利用上面定义的XML变量,并将数据分解到一个结果集中,它显示在XML变量中定义的人物姓名。

修改OPENXML存储过程

现在我来说明如何修改上周的OPENXML存储过程,使其可以应用XQuery功能。首先,我往XML变量中加载一些数据。如列表C所示。我们可以建立一个接受XML参数的过程,再应用XQuery函数把XML文件中的数据插入一个表中,而不必应用OPENXML。如列表D所示。

最初在数据库中应用XML似乎有些难于处理,还要花一些时间习惯使用XQuery和Xpath查询。但是,经过一段时间的学习以后,你就会发现在数据库中应用XML数据相当实用。

例如,在上述存储过程中应用XML数据,你只需调用一次数据库,而不必像典型存储过程编程那样调用N次数据库。这二者似乎区别不大,但对一个繁忙的系统而言,应用XML数据会有很大益处。而且,应用XQuery而非OPENXML还会显著提高性能,对小型XML文件更是如此。

34,596

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧