当Microsoft发布SQL Server 2005时,它引进了一个新的数据类型:XML。与其它的SQL Server数据类型一样,你可以使用XML数据类型来定义字段、存储过程和用户自定义方法的变量和参数,并且你可以整体存取XML数据——即作为一个值——就像一个XML文档一样。然而,与XML文档一样,可能有时候当你想存取的只是XML数据中的指定值时,你就需要使用到XQuery了。 XQuery是一个功能强大的、专门为存取XML数据而设计的脚本语言。
SQL Server2005支持一个允许在XML列、变量或参数中存取值的XQuery语言子集。通过调用XML数据类型支持的方法,就可以在Tra……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
当Microsoft发布SQL Server 2005时,它引进了一个新的数据类型:XML。与其它的SQL Server数据类型一样,你可以使用XML数据类型来定义字段、存储过程和用户自定义方法的变量和参数,并且你可以整体存取XML数据——即作为一个值——就像一个XML文档一样。然而,与XML文档一样,可能有时候当你想存取的只是XML数据中的指定值时,你就需要使用到XQuery了。
XQuery是一个功能强大的、专门为存取XML数据而设计的脚本语言。SQL Server2005支持一个允许在XML列、变量或参数中存取值的XQuery语言子集。通过调用XML数据类型支持的方法,就可以在Transact-SQL语句中使用XQuery。其中两种方法分别是value()和query()——这对于在XML数据中检索指定的元素是特别有用的。
在本文中,我将阐述这两种方法并分别举例说明。注意,本文假定你已经熟悉T-SQL和SQL Server的XML。
XML value()方法
当在Transact-SQL语句中调用XML方法时,需要指定一个XML字段、变量或参数名称,并且在其后面括号中包含一个周期、方法名称以及一个XQuery表达式。比如,在一个命名为XmlInfo的XML字段上调用一个value()方法,你可以使用下面的语法:
XmlInfo.value(<XQuery expression>) |
当你调用方法value()时,该XML方法返回一个指定类型的标量(单一的)值。这个value()方法有两个参数。第一个是检索的元素和值,而第二个是返回值的数据类型。让我们举一个例子来说明它是如何工作的。下面的语句在HumanResources表中的JobCandidateID和Resume字段中检索数据。JobCandidate表格(AdventureWorks示例数据库的一部分):
SELECT JobCandidateID, Resume.value('declare namespace ns= "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume"; (/ns:Resume/ns:Name/ns:Name.Last)[1]', 'nvarchar(30)') AS LastName FROM HumanResources.JobCandidate |
SELECT列表中的第二字段(Resume)是以XML数据类型定义的。因此,你可以调用任何XML方法。在这里,我调用了value()方法并且传输了两个参数。每个参数都包含在单引号中并且由一个逗号分隔。现在让我们仔细地看一下第一个参数。
第一个参数被分成两个部分并由分号分隔。第一部分表示的是命名空间并赋予“ns”别名。你必须任意类型化的XML字段指定命名空间。每一个类型化的字段都关联到一个指定的模式。在SQL Server Management Studio中,你可以通过检索XML列中整体值,然后点击返回值来确定与XML文档相关的模式。XML文档打开的是一个单独的窗口,如图1所示。注意,该模式被定义为根元素的属性。
图1:确定与XML文档关联的模式
当调用value()方法时,在XML文档中列出的模式就是作为命名空间的模式。如果XML字段是非类型化的(未关联到一个模式),那么就不需要声明命名空间,并且可以省略参数的第一部分。
参数的第二部分定义包含检索的值的XML元素。
元素基本上是一个由正斜线分隔的路径名称。当处理类型化的XML字段时,你必须先在路径名中的每个节点前加上命令空间别名,然后是冒号。在这里,我在每个节点前加上“ns:”。再次参照图1,你可以在文档的上方附近看到这个元素。
注意,路径名被包含在括号中并且其后面是[1]。因为value()方法只能返回多个数量值,因此你必须在括号的后面指定[1]以确保只有一个元素实例返回,即使在XML中只有一个实例。在你指定了路径之后,你必须指定数据类型。SQL语句现在就检索每个职位候选人的姓氏并将它作为NVARCHAR数据类型返回。
与其它的语言一样,XQuery支持广泛的各种不同方法。比如,下面的语句使用的是一个concat方法(在第一个参数的第二个部分)来连接名和姓:
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 FROM HumanResources.JobCandidate |
concat方法的多个参数是由逗号分隔的。每一个参数都必须串连。注意,第一个和第三个参数使用的是上例中一样的路径架构。更多关于concat方法和所有XQuery方法的信息,可以阅读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中,权限的分配很重要。特别是在用户数量众多的数据库里面,用户权限,架构的划分经常会导致权限之间的冲突,导致无法登陆。
-
TT数据库特别推荐:SQL Server编年史
无论是菜鸟还是资深DBA,除了要掌握基本的数据库管理、操作之外,还需要对不同产品的发展历史有一个了解。