您的位置:首页 > 博客中心 > 数据库 >

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

时间:2022-03-13 22:45

原文:

XML 介绍

正如你所看到的, XML用标签(tags)来命名XML文档的部件(parts).  这些部件称为元素(elements). 每个元素都有起始标签比如 <Customer>, 同时需要有相对应的结束标签,比如上面的 </Customer>. 如果一个元素没有内嵌元素,那么钙元素可以简写成一个标签来表示一个元素的开始和结束,比如上面的 <Order … />.元素可以潜逃,但是标签不能交叉,父元素的结束标签必须在最后一个嵌套元素的后面. 如果每个起始标签都有相对应的结束标签,并且标签嵌套,那么这个XML的文档结构良好.

XML文档是有序的. 这不是说他们以某个元素值排序,而是指元素的位置. 比如上面例子中 orderid等于10702 在第一个Customer元素的下面.

XML 是大小写敏感的Unicode文本.另外有些字符在XML文档里面表示标记,有特别的含义. 比如 < . 如果你想在XML文档里面用这些字符,必须用&+特殊字符+; 来转义.  见下表.

此外你也可以指定XML CDATA 段, 书写格式为 <![CDATA[...]]>. 你可以把中间的省略号用任何不包含”]]>”字符串的字符代替,这样就不会被XML当成标记了.

处理指令是用来指示应用程序处理XML的, 书写格式和元素类似,字符在小于号和大于号之间,并且起尾有问好,比如 <?PItarget data?>. 当引擎处理XML文档的时候就会接收到这些指令.

除了元素和处理指令之外,XML还包含备注标记, 格式为 <!-- This is a comment –>.

最后,XML文档的开始部分有XML版本和编码的标注,如 <?xml version="1.0" encoding="ISO-8859-15"?>.

除了XML文档(XML documents), 还有XML片段(XML fragments). 唯一的区别就是 XML文档有个单一根节点 之前例子中的 <CustomersOrders> .如果你把这个删掉那么就是XML片段了.

如果你把第二个customer元素删掉的话.上面这段就变成XML文档了.因为只有一个customer,又是单一根节点了.

正如你前面看到的,元素可以拥有属性(attributes). 属性有自己的名字和用双引号包裹的值. 这个是以属性为中心的(attribute-centric)
表示形式. 当然你也可以写不同的XML,每个属性可以作为一个嵌套的元素; 这个成为以元素为中心的(element-centric)表示形式.

另外,元素的名字不需要唯一, 因为他们可以通过位置来引用; 当然你也可以通过命名空间来区分不同地区,部门或公司的元素. 你可以在XML文档的根元素里面申明命名空间. 你也可以为每个命名空间指定一个别名. 命名空间的别名作为元素的前缀. 下面是一个以使用命名空间,并元素为中心的XML.数据和前一节的示例是一样的.

When you check whether an XML document complies with a schema, you validate the
document. A document with a predefined schema is said to be a typed XML document. (这段不知道怎么翻译,直翻连不起来.)

 

从关系数据生成XML

通过T-SQL 选择语句,你可以生成本课程中所有展示的XML. 这个章节教你怎么通过 FOR XML 子句把一个查询结果转换为XML .你会学到大多有用的选项和指令. 更详细的内容可以查看 SQL Server 2012 Books Online上的文章 “FOR XML (SQL Server)” .

 

FOR XML RAW

先来学一下 RAW 选项. XML的建立很接近关系数据的平面化表示 (The XML created is
quite close to the relational (tabular) presentation of the data) . 在 RAW 模式中, 记录集的( rowsets )的每一行转化为单个元素命名行,列被转为这个元素的属性. 下面是个FOR XML RAW 选项的XML文档例子

你也可以在RAW 模式中重命名行元素,增加根元素,命名空间或者使XML返回元素为中心(element-centric). 下面是一个增强版的列子.

正如你所看到的,这个文档,看上去更像XML了. 然而,那它还不包括附加的嵌套层次. 例子中的 customer 的属性 custid 等于1的值重复了三次
, 如果采用嵌套元素,每个订单只出现一次,那看上去就更好了. 你可以使用 FOR XML AUTO 选项实现 .

 

FOR XML AUTO

 

FOR XML AUTO 选项可以生成一个嵌套元素的XML文档, 并且使用起来也不复杂. 在 AUTO 和RAW 模式中, 你可以使用关键字ELEMENTS来生成 element-centric XML再使用 WITH NAMESPACES 子句, 在 SELECT 部分之前定义好命名空间和别名 . 至今为止, 你看到的都是 XML 结果 .下面是一个直观的使用SELECT 语句查询然后通过FOR XML 来生成XML的例子.

FOR XML PATH

再来说最后两个子句  EXPLICIT 和 PATH 选项—通过这两个选项,你可以完全控制XML文档返回的内容. EXPLICIT 模式只是向后兼容而存在的 ,这个是之前语法. PATH 模式使用标准的 XML XPath 表达式定义元素和属性.  这个章节主要讲 PATH 模式;如果你想学习更多的EXPLICIT 细节,请参考联机手册里面SQL Server 2012 相关的文章 “Use EXPLICIT Mode with FOR XML” .

在PATH 模式中, 列名和别名充当 XPath 表达式. XPath 表达式定义生成XML的元素路径,路径分层次表示.层级使用斜杠表示(/) 默认情况下没列都是元素,如果你希望生成属性为中心的XML,需要在别名前面加”at”(@)符号. 下面是个简单的XPATH查询

SELECT *
FROM OPENXML (@DocHandle, ‘/CustomersOrders/Customer/Order‘,11)
WITH (custid INT ‘../@custid‘,
companyname NVARCHAR(40 ) ‘../companyname‘,orderid int,orderdate NVARCHAR(40) );

第一节结束….我感觉我是把书翻译了一边 = = ,不足之处还请大家指正.

参考资料: EXAM 70-461 Query Microsoft SQL Server 2012 Training Kit

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集,布布扣,bubuko.com

热门排行

今日推荐

热门手游