除了在FOR子句中使用Boolean表达式,还可以在WHERE子句中定义相同的逻辑,如下例所示: 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:Res……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
除了在FOR子句中使用Boolean表达式,还可以在WHERE子句中定义相同的逻辑,如下例所示:
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 where $ed/ns:Edu.Level="Bachelor" return $ed') AS Education FROM HumanResources.JobCandidate |
在这种情况下,FOR子句中仅仅包含一个简单的路径,而WHERE子句中包含一个Boolean逻辑。注意,路径名称使用了$ed变量来指出了FOR子句循环访问的正确的Education元素。
在WHERE子句中使用这个逻辑可以更易于阅读和编写代码,特别是在使用复杂的Boolean表达式的时候。比如,下面的语句使用了WHERE子句中的“AND”逻辑操作符号,结果仅限于学士学位中主修学科为商务的记录。
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 where $ed/ns:Edu.Level="Bachelor" and $ed/ns:Edu.Major="Business" return $ed') AS Education FROM HumanResources.JobCandidate |
两个路径结果由“AND”操作符号连接。因此,只有当这两个条件都必须为真时才返回Education元素。
让我们来看一个包含ORDER BY子句的例子。下面的语句检索的是与技术和产品相关的就业信息:
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 $emp in /ns:Resume/ns:Employment where $emp/ns:Emp.FunctionCategory = "Production" or $emp/ns:Emp.FunctionCategory = "Technology" order by $emp/ns:Emp.EndDate descending return $emp') AS Employment FROM HumanResources.JobCandidate |
在上面的例子中,语句使用FOR子句来确定所需的元素(如,Employment)和WHERE子句来限制结果。但是,注意,语句也包含了ORDER BY子句。你可以使用这个子句来基于指定节点的排序结果。因此,我基于Emp.EndDate元素以降序的形式排序结果。这样,最近的就业信息将出现在列表的最前面。
正如你所看到的,当检索XML数据时,value()和query()方法是非常有用的。然而,我这里所涉及到的都只是些皮毛的知识。XQuery是一个强大的语言,它可以用来编写复杂查询并明确地按照你需要的方式来返回XML数据。由于XQuery支持大量各式各样的方法,操作符号和表达式,因此,你可以检索你的XML字段、变量和参数中存储的任意元素和属性——以任意需要的格式。同样的,你可以参考SQL Server 2005 Books Online上其它关于XQuery的信息以及更多的示例。
翻译
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中,权限的分配很重要。特别是在用户数量众多的数据库里面,用户权限,架构的划分经常会导致权限之间的冲突,导致无法登陆。
-
TT数据库特别推荐:SQL Server编年史
无论是菜鸟还是资深DBA,除了要掌握基本的数据库管理、操作之外,还需要对不同产品的发展历史有一个了解。