在SQL Server 2005中使用XQuery检索XML数据(三)

日期: 2009-02-10 作者:Robert Sheldon翻译:曾少宁 来源: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:Res……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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的能源管理》等。

相关推荐