你也可以用FOR XML子句将数据读取成XML格式,该方法从SQL Server表中返回数据,你可以把它们看做是XML数据。你可以在一个SELECT语句中运用FOR XML子句,它有三种模式可以以不同的格式来返回XML:RAW、AUTO和EXPLICIT。RAW模式将结果中的每个记录作为一个普通的行元素来返回,它被包含在一个标签中,并将每个列的值作为一个属性。AUTO模式将每个记录作为行元素返回,根据源表或视图对它进行命名。如果查询从一个表返回多个列,那么每个列的值就会被作为表元素的属性来返回。但最重要的是,如果你的SELECT语句执行了合并操作,那么AUTO模式就代表的是子行,它们作为元素嵌套在父行下。EXPLICIT模式有几个参数,你可以通过这些参数完全定义返回的XML的样式。你可以为每个元素定义标签,明确确定数据是如何嵌套的。FOR XML语句使我们不必再返回一个rowset,然后在客户端或中间层将它转换成XML了。
OPENXML函数可以让你像操作一个表那样来运用XML数据,可以将它们转换成内存中的一个rowset。要运用OPENXML,首先要调用sp_xml_preparedocument存储过程,实际上,它将XML解析成一个数据树,并将那个数据的句柄传递到OPENXML函数。然后你就可以操作那个数据了:进行查询、将它插入到表中、等等。OPENXML函数可以带有三个参数:用于XML文档内部显示的句柄、一个rowpattern参数和一个flags参数。Rowpattern参数指定了应该返回原始的XML文档中的哪些节点。Flags参数指定了以属性为中心的映射(结果集中列名符合属性名)或以元素为中心的映射(结果集中列名符合元素名)。在处理完XML数据后,我们可以调用sp_xml_removedocument将XML数据从内存中删除。
通过SQLXML得到更多的支持
通过发布SQLXML(也被称为Web版),Microsoft也在SQL Server中提供了更多的XML支持。已经有三个SQLXML的版本了,它们包含的一些额外的功能有updategram和XML Bulk Load。你可以在线下载最新的版本SQLXML 3.0(见资源)。你可以通过基于XML的模板,运用updategram来插入、更新或删除表中的数据。该模板有一个before block,它描述了记录更新前的当前状态;还有一个after block,它描述了记录的变化。下面就是updategram的一个例子,它修改了Shippers表中的一个公司的Phone字段:
在缺省情况下,updategrams认为before block和after block中的字段指的是表和列。但updategrams也可以用一个mapping schema。Mapping schema将一个XML文档中的元素与一个表中的元素关联了起来。如果在上面的模板中,你引用属性名SID,而不是ShipperID,那么mapping schema就会将SID映射到ShipperID列。你可以通过HTTP(同模板查询一样)或通过ADO将updategrams发送到SQL Server。它们也可以被参数化,带有输入值。Updategrams提供了一个方法,使我们可以直接从XML更新SQL Server数据,这样就不用从XML文档得到数据,然后再用一个记录集或调用一个存储过程了。Updategrams只是可以简单地插入、更新或删除数据,所以如果你需要查看一个值是否存在、或在更新前查看一些商业规则,那么你就应该用OPENXML。
虽然你可以用OPENXML函数和updategrams来插入数据,但对于加载大量的XML数据来说,这两种方法都不实用。你应该用XML Bulk Load将大量的XML数据插入到SQL Server表中。实际上,我们是用SQLXMLBulkLoad组件来加载数据的,你可以从一个客户端应用程序来调用这个组件。在建立到数据库的连接后,bulk load组件需要一个路径来访问mapping schema,从而将XML属性和元素映射到数据库对象,而且还需要路径来访问一个XML文档或一个XML流。在Bulk Load组件中,你可以指定是否执行数据表检查约束(check constraint)、是否忽略通过复制键添加的记录、当插入数据时,是否应该锁定数据表,等等。
缺省情况下,大量加载不是事务处理型(transactional)的,所以如果出现错误,截止到错误点前插入的数据就会保留在数据库中。你可以指定所有加载的数据都是在一个单独的事务处理过程中的,因此该过程要么会十分成功,要么会回滚。如果你用了事务处理,所有的数据在插入前都会被写进一个临时的文件。这就意味着,你需要足够的磁盘空间来保存临时文件,而且加载数据可能会相当慢。XML Bulk Load给我们提供了一个很好的方法,使我们可以将大量的数据写到SQL Server中;否则,你就必须提取数据,然后用另外的方法将它加载到你的数据库中。
你也可以配置SQL Server来缓存XSLT样式表、模板和mapping schema,从而得到更好的性能。根据具体实现情况,你可以在Web应用程序中用通过HTTP和XSLT的XML查询来替代标准的ASP/ADO数据访问,从而得到HTML输出结果,这种方法可以极大地提高性能。
以上就是SQL Server对XML的一些高级支持。不管我们对它的宣传有多少,XML的功能就这么多了。因为XML是用来显示数据的一个标准,也是用于.NET的数据传输技术,因此,XML与SQL Server的集成能力就会是企业需要解决的一个重要的问题。