|
| |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
你可能想在程序当中使用XML,但是仅仅用一个简朴的查询是不能从Microsoft SQL Server 2000中获取其信息的。 让我们假设你想将一个HTML 表格连接到一个XML数据岛,但是你十分确定要将若干表格套入母表中十分复杂。母表中的每一个表格一定是XML数据结构中父节点下的一组节点。电话号码目录就是一个很好的例子。 <TABLE dataSrc="#xmlPhoneData"> <TR> <TD> <SPAN dataFld="fname"></SPAN> <SPAN dataFld="lname"></SPAN> </TD> </TR> <TR> <TD> <TABLE dataSrc="#xmlPhoneData" dataFld="phone"> <TR> <TD><SPAN dataFld="phone_type"></SPAN>:</TD> <TD><SPAN dataFld="phone_no"></SPAN></TD> </TR> </TABLE> </TD> </TR> <TR> <TD> <TABLE dataSrc="#xmlPhoneData" dataFld="other_info"> <TR> <TD><SPAN dataFld="info_type"></SPAN>:</TD> <TD><SPAN dataFld="info_data">/SPAN></TD> </TR> </TABLE> </TD> </TR> </TABLE> TABLE代表一系列信息,包括目录中某个人的名字、所有的电话号码和那个人的其他信息(譬如说,地址等)。 这个XML的模型如下: <root> <data> <lname/> <fname/> <phone> <phone_type/> <phone_no/> </phone> <other_info> <info_type/> <info_data/> </other_info> </data> </root> 尽管创建这个XML模型不是不可能的,我们仍旧在本文中使用这个简朴的例子。 首先,我们将提供一些背景知识使其更全面。数据来源于三个方面:包含员工的名(fname)和姓(lname)的职工表;包含员工电话类型(phone_type)和电话号码(phone_no)的电话表;包含员工其他信息(如地址等)的其他信息表(other_info)。 假如你想将信息从这些表中抓取到一个记录集中,SQL查询可以如下: SELECT employee.lname, employee.fname, phone.phone_type, phone.phone_no, other_info.info_type, other_info.info_data FROM employee LEFT JOIN phone ON phone.employee_id = employee.employee_id LEFT JOIN other_info ON other_info.employee_id = employee.employee_id 当你需要SQL 2000中有XML的时候,你通常可以在查询字符串的末尾输入一个FOR XML AUTO, ELEMENTS语句,你就可以得到想要的XML字符串。但是,多个节点会有一点小问题。单个节点很轻易,但当你引用多个表格时,你可能不会花整天时间去尝试获得想要的XML输出。 另一个方式就是关闭行计算和数据输出。你可以通过将一个指针移入母表数据,用一个指令来操作记录,然后从带有FOR XML AUTO、ELEMENTS语句的其他表格选择相关记录以分流XML输出来实现。 这个功能最好保存到一个存储程序,因为指针比较慢,而一个存储程序被事先编辑好。下面就是完成这项任务的存储程序(Transact SQL)。 DECLARE @employee_id int DECLARE @fname varchar(50) DECLARE @lname varchar(50) DECLARE phone_cursor CURSOR FOR SELECT employee_id, fname, lname FROM employees ORDER BY lname, fname SET NOCOUNT ON OPEN phone_cursor FETCH NEXT FROM phone_cursor INTO @employee_id, @fname, @lname WHILE @@FETCH_STATUS = 0 BEGIN SELECT \\\'<data><fname>\\\' + @fname + \\\'</fname><lname>\\\' + @lname + \\\'</lname>\\\' SELECT phone_type, phone_no FROM phone WHERE employee_id = @employee_id FOR XML AUTO, ELEMENTS SELECT info_type, info_data FROM other_info WHERE employee_id = @employee_id FOR XML AUTO, ELEMENTS SELECT \\\'</data>\\\' FETCH NEXT FROM phone_cursor INTO @employee_id, @fname, @lname END CLOSE phone_cursor DEALLOCATE phone_cursor SET NOCOUNT OFF GO 这几句SQL创建了一个用以存储员工数据和重复执行的指针。为了解除每一个SELECT语句后的行计算输出功能,NOCOUNT被设置为ON。当指针中的每条记录在被操作的时候,构成了一个包含着XML输出的名和姓节点字符串。电话信息和其他信息也都创建了XML。 然后,父节点关闭。在成功地完成了指针操作以后,关闭指针并对其再分配。这就得到了一个符合目标XML模型的XML字符串。 为了有效的使用这个XML输出字符串,输出必须存储在一个ADO流对象中。利用流对象中的ReadText方式可以访问数据: <XML id="xmlPhoneData" name="xmlPhoneData"> <% Dim adoConn, adoCmd Dim adoStream Set adoConn = Server.CreateObject("ADODB.Connection") Set adoCmd = Server.CreateObject("ADODB.Command") adoConn.ConnectionString = "Some Connection String To MS SQL 2K" adoConn.Open Set adoCmd.ActiveConnection = adoConn Set adoStream = Server.CreateObject("ADODB.Stream") adoCmd.CommandType = 4 \\\'adCmdStoredProc adoCmd.CommandText = "get_test_phone" adoStream.Open adoCmd.Properties("Output Stream") = adoStream adoCmd.Execute ,,1024 \\\'adExecuteStream Response.Write adoStream.ReadText(-1) adoStream.Close Set adoStream = Nothing adoConn.Close Set adoCmd = Nothing Set adoConn = Nothing %> </XML> 以上代码创建了一个ADO到SQL 2000的连接,执行了一个存储程序。结果被储存在ADO流对象(adoStream)中。其数据写入Response缓冲器,流对象被关闭,然后是一些“清仓”操作。 这个范例提供了一个创建用户化XML方案的一般方式。通过将HTML表格连接到XML数据岛,你可以创造一些针对性的解决方式。 返回类别: 教程 上一教程: SQL数据操作基础(中级)9 下一教程: SQL SERVER密码安全追踪和存储 您可以阅读与"用SQL 2000创建用户化XML流"相关的教程: · SQL SERVER2000中用户自定义数据类型的使用 · 深入探讨SQL SERVER 2000对XML的支持 · 深入探讨SQL Server 2000对XML的支持 · 如何将 XML 文件导入 SQL Server 2000? · 使用T_SQL脚本创建SQL SERVER2000后台计划作业任务 |
| 快精灵印艺坊 版权所有 |
首页 |
||