数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

使SQL Server数据支持 XML


发布日期:2018年12月26日
 
使SQL Server数据支持 XML

学习如何用SQL Server的XML特征为你的数据库提供新的功能

如果你在IT业工作那么你很可能听说过XML但如果你的工作主要与SQL Server有关那么你可能并没有直接运用过XMLXML已经是Web编程环境中的普遍的数据格式了而且它也是NET Framework中主要的底层技术之一SQL Server以两种方式来支持XML通过SQL Server本身的功能以及通过发布称为SQLXML的额外的功能SQLXML扩展了SQL Server并提供了XML兼容性在本月的专栏中我将讲述SQL Server对XML的内置的支持并讲述通过发布SQLXML而增加的一些功能(见 图SQL Server支持XML就意味着我们可以更有效地更新和读取数据了我们不再需要将XML数据转换成数据库可以理解的另一种格式或将XML数据从数据库转换成XML而且可供开发人员选择的方法也更多了就是说他们在访问数据方面更灵活了

对XML的宣传已经有很多了所以重要的一点是要意识到它只是一门简单的技术本质上它是用来描述数据的一个标准的文件格式(有关XML基础知识的更多的信息请参阅工具条XML )从发布SQL Server 的最初版本以来对XML的支持就已经是SQL Server的一部分了SQL Server不是通过提供一个方法保存XML文件来支持XML的而是提供了一个到关系数据的接口使你可以在表和其它数据库对象中读写XML数据SQL Server所固有的XML功能包括可以通过HTTP模板查询FOR XML子句和OPENXML()函数来访问SQL Server接下来我将讲述这些功能是如何运作的以及它们可以如何使你的企业受益

提供 XML支持

要通过HTTP访问一个SQL Server数据库你必须首先设置一个虚拟目录这个虚拟目录在HTTP协议和一个特定的数据库之间提供了一个链接设置虚拟目录时我们需要用Configure SQL XML Support In IIS菜单条目你可以在Window的Start菜单中的SQL Server菜单条目找到该项通过该菜单条目你就可以指定虚拟目录的名称物理路径服务器名称数据库名称和注册信息一旦你创建了一个虚拟目录你就可以通过一个URL将查询发送到数据库了如果你设置了一个叫做Northwind的虚拟目录并在浏览器中输入了查//localhost/Northwind?sql=SELECT+*+FROM+Shippers+FOR+XML+AUTOELEMENTS+&root=Shippers它就会返回类似于XML 工具条中的Shippers例子中的XML数据与运用ADO或其它任何技术相比HTTP查询会让我们更容易地来访问网站或Web应用程序的数据 对于一个简单的查询语句来说HTTP查询会很好但对于一个更复杂的查询来说这种格式就会变得难以理解并很难管理了这种方法也不安全因为查询源代码是暴露给用户的另外一种可选方法是在HTTP上调用一个模板查询一个模板查询就是一个包含SQL查询的XML文件模板作为文件保存在服务器上因此如果你在一个叫做GetShippersxml的模板中封装了Shippers SELECT查询那么URL查询的形式就会是模板也可以带有参数当你的模板调用一个存储过程时该功能会很有用在URL查询和模板查询中如果你想从查询返回一个HTML页面那么你可以指定一个XSLT样式表将它用于XML模板查询是读取数据的一个更安全的方法它可以被缓存以得到更好的性能

你也可以用FOR XML子句将数据读取成XML格式该方法从SQL Server表中返回数据你可以把它们看做是XML数据你可以在一个SELECT语句中运用FOR XML子句它有三种模式可以以不同的格式来返回XMLRAWAUTO和EXPLICITRAW模式将结果中的每个记录作为一个普通的行元素来返回它被包含在一个<row/>标签中并将每个列的值作为一个属性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 (见资源)你可以通过基于XML的模板运用updategram来插入更新或删除表中的数据该模板有一个before block它描述了记录更新前的当前状态还有一个after block它描述了记录的变化下面就是updategram的一个例子它修改了Shippers表中的一个公司的Phone字段

在缺省情况下updategrams认为before block和after block中的字段指的是表和列但updategrams也可以用一个mapping schemaMapping 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的集成能力就会是企业需要解决的一个重要的问题

上一篇:存储过程里动态生成包含SQL语句字符串

下一篇:用SQL测试具有百万条记录的数据库