标题: 用SQL 2000创建用户化XML流
问天
元帅
Rank: 1


元帅勋章 终身成就勋章
UID 11493
精华 187
积分 34221
帖子 33355
威望 91
金币 13148
热心 2619
阅读权限 100
注册 2006-4-7
状态 离线
用SQL 2000创建用户化XML流

你可能想在程序当中使用
XML
,但是仅仅用一个简单的查询是不能从Microsoft SQL Server 2000中获取其信息的。

让我们假设你想将一个HTML 表格连接到一个
XML
数据岛,但是你十分确定要将若干表格套入母表中十分复杂。母表中的每一个表格一定是
XML
数据结构中父节点下的一组节点。电话号码目录就是一个很好的例子。      
<TABLE dataSrc="#xmlPhoneData">
<TR>
    <TD>
        <SPAN dataFld="fname"></SPAN>&;amp;nbsp;
        <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
数据岛,你可以创造一些针对性的解决方法。  

网友 问天 签名 - 网友社区 请您回个帖。谢谢
PR查询 免费域名 免费空间
顶部
[广告] 免费域名(Free Subdomain) 免费空间(Free hosting) PR查询(Google Pagerank)



当前时区 GMT+8, 现在时间是 2008-12-2 14:41
信产部ICP备案:京ICP备05066424号 北京市公安局网监备案:1101050648号

Powered by Discuz! 5.5.0
清除 Cookies - 联系我们 - 网友俱乐部 - Archiver - WAP