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

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

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

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

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

微信公众号

TechTarget微信公众号二维码

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元素以及所有的子节点。

  指定检索的XML元素

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

相关推荐