用SQL 2000创建用户化XML流

xml|创建

你可能想在程序当中使用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数据岛,你可以创造一些针对性的解决方法。

时间: 2024-10-18 10:40:05

用SQL 2000创建用户化XML流的相关文章

用XML和SQL 2000来管理存储过程调用_XML/RSS

创建多个带有不同参数的存储过程(stored procedure)来完成同一个任务总是一个很大的负担.利用XML字符串向你的存储过程发送参数就能够简化这个任务:这也让COM组件的设计更简单.  实现这个目的的方法是将你的参数作为一个XML字符串来传递,并剖析XML来取回你所需要的数据,然后继续实现你所需要集成的功能.你不仅可以通过XML来获取一些参数,你还可以对XML所创建的DOM文档运行查询,以此来封装多个存储过程.我会提供一些例子,告诉你如果实现这个目的,并简要地描述每个例子. 在本例里,为

Oracle 11g简化版通过导入SQL创建用户

环境:Oracle 11g R2 + SQLPlus 问题:Oracle导入SQL 解决: Win +Run------- >Cmd------->输入以下命令: --语法:sqlplus 用户名/密码 @sql文件 sqlplus system/manager @H:\Oracle\product\11.2.0\dbhome_1\RDBMS\ADMIN\scott.sql 说明:H:\Oracle\product\11.2.0\dbhome_1\RDBMS\ADMIN下的scott.sql文

图片-SQL server创建新用户出现问题,如何解决?

问题描述 SQL server创建新用户出现问题,如何解决? 解决方案 XZU1是Windows登陆的用户名表现形式,要Windows(域或本机)有这个用户才行.不能从SqlServer去创建操作系统的用户

用sql developer创建新用户出现问题。。新手,第一次用oracle,求解

问题描述 用sql developer创建新用户出现问题..新手,第一次用oracle,求解 在行 2 上开始执行命令时出错: CREATE USER ##liupeng IDENTIFIED BY liupeng DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" 命令出错, 行: 2 列: 13 错误报告: SQL 错误: ORA-00911: 无效字符 00911. 00000 - "inva

Microsoft SQL Server 2005 中的 XML 支持(1)

本文探讨 SQL Server 2005 中内置的 XML 支持.描述了这种支持如何与 .NET 框架 V2.0 和本机代码(例如 OLEDB 和 SQLXML)均支持的客户端编程相集成. 一.简介 可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用.它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的.数据交换已成为 XML 技术的主要驱动力之一.. XML 在企业应用程序中的使用正日益广泛,它主要用于对半结构化和非结构化

Microsoft SQL Server 2005 中的 XML 选项

本文介绍 Visual Studio 2005/SQL Server 2005 环境中用于处理 XML 数据的三个选项,包括使用方案以及指导用户在各选项之间进行选择的指南. 一.System.Xml.SQLXML 和 XML 数据类型简介 本节简要介绍 Microsoft SQL Server 2000 中提供的 XML 支持的发展历史,并概要介绍 Microsoft Visual Studio 2005/SQL Server 2005 环境中提供的用于处理 XML 和关系数据的三个选项.这三个

SQL Server 2008中有关XML的新功能

1 导言 Microsoft 在Microsoft SQL Server 2000中推出了与XML相关的功能以及Transact-SQL 关键字FOR XML和OPENXML ,这使得开发人员可以编写Transact-SQL代码来获取XML流形式的查询结果,并将一个XML 文档分割成一个rowset.SQL Server 2005显著的扩展了这些XML功能,推出了一个支持XSD schema验证. 基于XQuery的操作和XML索引的本地的xml 数据类型.SQL Server 2008建立在之

从 SQL Server 2005 中处理 XML

一.简介 Microsoft SQL Server 2005 中的重大更改之一是包含了 XML 数据类型.此数据类型是第一类类型,就像 INT 或 VARCHAR 一样,而且 SQL Server 2005 允许使用一系列 XML 特定的函数对此数据类型进行就地查询和处理.它还支持存储数据库中的 XML 架构的集合,从而启用基于数据库的架构验证.另外,SQL Server 2005 大大地扩展了 XML 组合(SELECT ... FOR XML 语句)的功能,扩展了 OpenXML() XML

Smooks结构化事件流处理

概览 Smooks是一个开源的Java框架,用于处理"数据事件流".它常常被认为是一个转换框架并以此被用于好几个产品和项目中,包括JBoss ESB(以及其它ESB).然而究其核心,Smooks未提及"转换"或者其它相关的词汇.它的应用远不只这一点! Smooks的工作是将结构化/层次化的数据流转变成"事件"流,然后交与"访问者逻辑(Visitor Logic)"进行分析,生成结果(可选的). 源 ->结构化事件流(访问