|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,MySQLAB创始人之一的的女儿也叫My。xml|创立你大概想在程序傍边利用XML,可是仅仅用一个复杂的查询是不克不及从MicrosoftSQLServer2000中猎取其信息的。
让我们假定你想将一个HTML表格毗连到一个XML数据岛,可是你非常断定要将多少表格套进母表中非常庞大。母表中的每个表格必定是XML数据布局中父节点下的一组节点。德律风号码目次就是一个很好的例子。
<TABLEdataSrc="#xmlPhoneData">
<TR>
<TD>
<SPANdataFld="fname"></SPAN>
<SPANdataFld="lname"></SPAN>
</TD>
</TR>
<TR>
<TD>
<TABLEdataSrc="#xmlPhoneData"dataFld="phone">
<TR>
<TD><SPANdataFld="phone_type"></SPAN>:</TD>
<TD><SPANdataFld="phone_no"></SPAN></TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD>
<TABLEdataSrc="#xmlPhoneData"dataFld="other_info">
<TR>
<TD><SPANdataFld="info_type"></SPAN>:</TD>
<TD><SPANdataFld="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查询能够以下:
SELECTemployee.lname,employee.fname,phone.phone_type,phone.phone_no,
other_info.info_type,other_info.info_dataFROMemployeeLEFTJOINphoneON
phone.employee_id=employee.employee_idLEFTJOINother_infoON
other_info.employee_id=employee.employee_id
当你必要SQL2000中有XML的时分,你一般能够在查询字符串的开端输出一个FORXMLAUTO,ELEMENTS语句,你就能够失掉想要的XML字符串。可是,多个节点会有一点小成绩。单个节点很简单,但当你援用多个表格时,你大概不会花成天工夫往实验取得想要的XML输入。
另外一个办法就是封闭行盘算和数据输入。你能够经由过程将一个指针移进母表数据,用一个指令来操纵纪录,然后从带有FORXMLAUTO、ELEMENTS语句的其他表格选择相干纪录以分流XML输入来完成。
这个功效最好保留到一个存储程序,由于指针对照慢,而一个存储程序被事前编纂好。上面就是完成这项义务的存储程序(TransactSQL)。
DECLARE@employee_idint
DECLARE@fnamevarchar(50)
DECLARE@lnamevarchar(50)
DECLAREphone_cursorCURSORFORSELECTemployee_id,fname,lnameFROMemployees
ORDERBYlname,fname
SETNOCOUNTON
OPENphone_cursor
FETCHNEXTFROMphone_cursorINTO@employee_id,@fname,@lname
WHILE@@FETCH_STATUS=0
BEGIN
SELECT<data><fname>+@fname+</fname><lname>+@lname+
</lname>
SELECTphone_type,phone_noFROMphoneWHEREemployee_id=
@employee_idFORXMLAUTO,ELEMENTS
SELECTinfo_type,info_dataFROMother_infoWHEREemployee_id=
@employee_idFORXMLAUTO,ELEMENTS
SELECT</data>
FETCHNEXTFROMphone_cursorINTO@employee_id,@fname,@lname
END
CLOSEphone_cursor
DEALLOCATEphone_cursor
SETNOCOUNTOFF
GO
这几句SQL创立了一个用以存储员工数据和反复实行的指针。为懂得除每个SELECT语句后的行盘算输入功效,NOCOUNT被设置为ON。当指针中的每笔记录在被操纵的时分,组成了一个包括着XML输入的名和姓节点字符串。德律风信息和其他信息也都创立了XML。
然后,父节点封闭。在乐成地完成了指针操纵今后,封闭指针并对其再分派。这就失掉了一个切合方针XML模子的XML字符串。
为了无效的利用这个XML输入字符串,输入必需存储在一个ADO流工具中。使用流工具中的ReadText办法能够会见数据:
<XMLid="xmlPhoneData"name="xmlPhoneData">
<%
DimadoConn,adoCmd
DimadoStream
SetadoConn=Server.CreateObject("ADODB.Connection")
SetadoCmd=Server.CreateObject("ADODB.Command")
adoConn.ConnectionString="SomeConnectionStringToMSSQL2K"
adoConn.Open
SetadoCmd.ActiveConnection=adoConn
SetadoStream=Server.CreateObject("ADODB.Stream")
adoCmd.CommandType=4adCmdStoredProc
adoCmd.CommandText="get_test_phone"
adoStream.Open
adoCmd.Properties("OutputStream")=adoStream
adoCmd.Execute,,1024adExecuteStream
Response.WriteadoStream.ReadText(-1)
adoStream.Close
SetadoStream=Nothing
adoConn.Close
SetadoCmd=Nothing
SetadoConn=Nothing
%>
</XML>
以上代码创立了一个ADO到SQL2000的毗连,实行了一个存储程序。了局被贮存在ADO流工具(adoStream)中。其数据写进Response缓冲器,流工具被封闭,然后是一些“清仓”操纵。
这个典范供应了一个创立用户化XML计划的一样平常办法。经由过程将HTML表格毗连到XML数据岛,你能够制造一些针对性的办理办法。
因此我们的方案中要构造这种逆操作。Event_type增加一种FlashBACK_EVENT。这类操作形式与Query_Event相同,都是简单的SQL语句,只是包含了将数据恢复的操作。 |
|