XML的query()方法 虽然value()方法可以很便捷地在XML字段中检索一个值。然而,当经常检索多个值时,你必须使用XML的 query()方法。query()方法只需要一个参数并返回一个指定的XML元素。比如,在下面的SQL语句中返回一个Education元素以及每个职位候选人的的子节点。
SELECT JobCandidateID, Resume.value(‘declare namespace ns= “http://schemas.microsoft.com/sqlserver/2004/07/adventur……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
XML的query()方法
虽然value()方法可以很便捷地在XML字段中检索一个值。然而,当经常检索多个值时,你必须使用XML的 query()方法。query()方法只需要一个参数并返回一个指定的XML元素。比如,在下面的SQL语句中返回一个Education元素以及每个职位候选人的的子节点。
SELECT JobCandidateID, Resume.value('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; concat((/ns:Resume/ns:Name/ns:Name.First)[1], " ", (/ns:Resume/ns:Name/ns:Name.Last)[1])', 'nvarchar(60)') AS FullName, Resume.query('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; /ns:Resume/ns:Education') AS Education FROM HumanResources.JobCandidate |
query()方法的参数是包含在单一的引号中并分成两个部分。同样,当在一个类型化的字段中检索数据时,你必须指定一个命名空间。命名空间的声明方式与value()方法中的一样。在声明了命名空间之后,便可以指定检索的元素。在这种情况下,如图2所示,将返回Education元素以及所有的子节点。
图2:一旦声明了命名空间,便可以指定检索的XML元素。
通过将第二部分的参数转换为FLWOR(发音为flower)表达式,我们也可以获得同样的结果。按照定义,该表达式是由“FOR、LET、WHERE、ORDER BY 和RETURN”子句组成的。但是,注意,目前SQL Server并不支持LET子句。
下面的XML query()方法使用的是“FOR”和“RETURN”子句来检索Education元素以及子节点:
SELECT JobCandidateID, Resume.value('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; concat((/ns:Resume/ns:Name/ns:Name.First)[1], " ", (/ns:Resume/ns:Name/ns:Name.Last)[1])', 'nvarchar(60)') AS FullName, Resume.query('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; for $ed in /ns:Resume/ns:Education return $ed')AS Education FROM HumanResources.JobCandidate |
正如你所看到的,FOR子句包含$ed变量。你并不需要显式地声明这个变量。在FOR子句中使用就可以了。这个变量是用于遍历Education元素的。(只要遵循SQL Server的命名规范,变量可以使用任何名称。)而RETURN子句引用$ed变量。因此,它返回每一个Education元素和子节点。
当然,一般不会只是使用一个FLWER表达式来检索一个参数和子节点。但是,你可以在FOR子句(在括号中)的路径名称上包含一个表达式来限制返回的结果。比如,下面的语句限制了结果中Edu.Level值为“Bachelor”的Education元素:
SELECT JobCandidateID, Resume.value('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; concat((/ns:Resume/ns:Name/ns:Name.First)[1], " ", (/ns:Resume/ns:Name/ns:Name.Last)[1])', 'nvarchar(60)') AS FullName, Resume.query('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; for $ed in /ns:Resume/ns:Education[ns:Edu.Level="Bachelor"] return $ed') AS Education FROM HumanResources.JobCandidate |
注意,我使用的是相等的比较操作符(=)来比较Edu.Level元素值和字符串值。这样就构成一个Boolean表达式,当结果中包含该元素时为true。XQuery支持各种创建Boolean表达式的操作符号。你可以在Microsoft SQL Server 2005 Books online上阅读支持的操作符。
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
SQL Server 2005支持服务结束 升级何去何从
SQL Server 2005的支持就要结束了,就在2016年4月12日,SQL Server 2005的客户们应该升级了。
-
SQL Server 2005即将终止服务 你准备好了么?
2016年4月12日,微软将正式终止SQL Server 2005相关服务。微软正在终止扩展支持,这意味着不再有新特性更新,什么都没了。
-
解决SQL服务器提示属性IsLocked不可用于登录用户的错误
在SQL Server中,权限的分配很重要。特别是在用户数量众多的数据库里面,用户权限,架构的划分经常会导致权限之间的冲突,导致无法登陆。
-
Dex:MongoDB索引优化工具
Dex是一个开源的MongoDB优化工具,它通过对查询日志和当前数据库索引进行分析,向管理员提出高效的索引优化策略。