仓酷云
标题:
MYSQL编程:Microsoft SQL Server 2005 中的 XML 选...
[打印本页]
作者:
再现理想
时间:
2015-1-16 22:17
标题:
MYSQL编程:Microsoft SQL Server 2005 中的 XML 选...
而且其固有的弹性使得它易于扩展以处理不断增长的需求,或当需求MySQL学习教程减弱时缩减规模。 本文先容VisualStudio2005/SQLServer2005情况顶用于处置XML数据的三个选项,包含利用计划和引导用户在各选项之间举行选择的指南。
1、System.Xml、SQLXML和XML数据范例简介
本节扼要先容MicrosoftSQLServer2000中供应的XML撑持的开展汗青,并提要先容MicrosoftVisualStudio2005/SQLServer2005情况中供应的用于处置XML和干系数据的三个选项。这三个选项是:1)System.Xml定名空间中的类,2)SQLXML类,3)SQLServer2005中供应的XML数据范例。
XML撑持最早增加到MicrosoftSQLServer2000中,为用户供应以下功效:
•
将干系数据作为XML公然
•
将XML文档拆分到行汇合
•
经由过程利用XML数据精简(XDR)计划,将XML计划映照到数据库计划,从而创立XML视图
•
利用XPath在XML视图上创立查询
•
在SQLServer中经由过程HTTP公然数据
此撑持在SQLXMLWeb的后续版本中失掉了进一步加强。加强功效包含:
•
更新程序和XML海量加载能够保存对XML视图的变动
•
撑持带讲明的XML计划界说言语(XSD),以便形貌映照(仍旧撑持XDR,但不倡议利用)
•
客户真个FORXML
•
SQLXML托管类
•
撑持Web服务
Microsoft.NETFramework1.0对读取、写进和处置XML文档供应了普遍的撑持。这类撑持在.NETFramework2.0中失掉了进一步加强,进步了各类XML类的功能和可用性。.NETFramework在System.Xml定名空间中供应的新类可用于在XML数据与干系数据之间举行互相映照。
SQLXML是一组使SQLServer数据库中的干系数据可以与XML无缝集成的库和手艺。它是一其中间层组件,不包含由FORXML和OPENXML供应的服务器端XML撑持。SQLXML供应了一个计划驱动的映照办法,可以从干系源数据天生XML并将暗示干系信息的XML加载回干系表中。SQLXML类对SQLServer2000(及更高版本)的数据库供应了XML撑持。
MicrosoftSQLServer2005以XML数据范例的情势增加了内置的XML撑持。XML数据能够存储在XML数据范例列外部。别的,经由过程将一个XML计划汇合与此XML数据范例列联系关系,还能够对其举行进一步的限定。存储在XML数据范例列中的XML值能够借助XQuery和XML数据修正言语(DML)举行处置。能够在XML数据上创建索引,以加强查询功能。别的,FORXML和OPENXML也已失掉加强,可以撑持新的XML数据范例。
SQLServer2005中引进的存储和处置XML数据的新功效与SQLServer初期版本中供应的XML功效分离在一同,为开辟职员供应了多种在XML使用程序中存储和处置XML数据的办法。因为利用SQLServer2005供应的办法,有多种办法能够天生XML使用程序,因而,懂得各类分歧手艺的计划,和怎样在各类手艺之间举行衡量和共同关于作出准确的选择是相当主要的。本文供应了怎样选择得当的办法,利用SQLServer2005开辟XML使用程序的指南。
2、XML利用计划
XML的使用范畴可大抵分别为:
•
用于贸易集成的XML:贸易集成,也称为企业使用集成(EAI),包含A2A(使用程序对使用程序)、B2B(企业对企业)和B2C(企业对用户)使用程序。运转在分歧体系上的使用程序利用基于XML的动静互相通信。
•
用于内容办理的XML:利用基于XML的内容办理体系,用户能够存储、检索、修正和查询XML文档。这些体系以其原有格局存储XML文档。
上面先容切合上述分类的几种计划。这些计划的办理计划将在以下几节中给出,而且会具体先容SQLServer2005/VisualStudio2005情况中供应的各类XML选项的处置情形。
计划1:保险理赔
一家汽车保险公司在Internet上供应服务,同意其投保人或代办署理经由过程公司的网站进进保险理赔。理赔将由位于公司总部的中心体系举行处置。处置终了后,体系会将与该理赔相干的信息以指定的XML格局存储起来。体系中必需保存这些XML文档的准确正本,以便用于功令用处。此计划展现了XML在内容办理中的使用。
计划2:汽车打造商与零件供给商之间的数据互换I
一家汽车打造商与多家零件供给商举行交互,以便取得公司所需的零件。一般,该打造商要吸收供给商的发票。然后,将与发票相干的数据手动输出到老式的发票处置体系中。发票处置体系以干系格局存储数据。而如今,该打造商但愿将发票数据主动输出到老式的发票处置体系中。此计划是XML用于贸易集成的示例。
计划3:汽车打造商与零件供给商之间的数据互换II
此计划包括一家与多家零件供给商举行交互的汽车打造商,如前一计划中所述。该打造商今朝利用的体系不克不及为供给商供应查询发票形态大概从打造商取得付款申明的正本的功效。今朝,供给商只能经由过程德律风取得这些信息。该汽车打造商必要经由过程Web公然这些信息,以使供给商可以主动实行这些义务。此计划展现了XML在贸易集成中的使用。
计划4:内容办理体系
某公司经由过程Web、书本和CD-ROM等多种渠道向其客户供应医学、功令和手艺等范畴的信息。该公司要创建一套内容办理体系,以匡助其在较短的工夫外向客户供应高质量的内容。此计划展现了XML在内容办理中的使用。
计划5:客户查询拜访
某公司在Internet上供应机票预订营业,要对每一个季候举行查询拜访,以断定以后季候最受客户喜好的旅游地址。每一个季候所用的查询拜访表均分歧,并且未来查询拜访表也大概改动。该公司将对换查信息举行剖析,并依据剖析了局计划出满意年夜多半客户请求的旅游套餐。此计划可看做XML在内容办理中的使用。
3、.NETFramework中的XML类
Microsoft.NETFramework对开辟基于XML的产物供应了出色的撑持。在.NETFramework中,XmlTextReader、XmlTextWriter、XmlDocument和XmlValidatingReader等中心类能够在System.Xml定名空间中取得,该定名空间是一切XML类的根定名空间。利用这些中心类,用户可使用基于数据流和基于DOM(基于文档工具模子)的两种扫瞄/会见模子来读取、写进和考证XML文档。System.Xml定名空间包括以下子定名空间:
•
System.Xml.Schema-包括用于处置XML计划界说言语(XSD)计划的类。
•
System.Xml.Serialization-供应将工具序列化为XML格局的文档或数据流的类。
•
System.Xml.XPath-包含利用XPath表达式扫瞄XML文档的类。
•
System.Xml.Xsl-具有效于实行可扩大款式表转换(XSLT)的类。
System.Xml定名空间的加强功效
在VisualStudio2005中,新类(如XsltCommand)和对现有XML类(如XmlDocument)的加强可用于对XML数据举行各类操纵,包含修正XML文档、使用XSL转换等。
VisualStudio2005中与System.Xml定名空间中的XML类相干的一些加强功效以下:
•
XmlDocument类增加了XML计划考证撑持。
•
XmlReader和XmlWriter类的功效失掉了加强,功能明显进步,并撑持XML计划范例。并且,还增加了静态Create办法,供应了一种较为复杂的办法,可以使用XmlReaderSettings和XmlWriterSettings类创立XmlReader和XmlWriter实例,以便设置所创立的范例。
有关System.Xml加强功效的具体信息,请拜见WhatsNewinSystem.XmlforVisualStudio2005andthe.NETFramework2.0Release白皮书。
System.Xml定名空间中的类可用于完成自界说的XML剖析、处置和存储逻辑。使用SQLServer2005的大众言语运转库(CLR)的宿主功效和VisualStudio2005中的XML类,能够在两头层或数据库层处置XML。
.NETFramework中的XML类的利用包含将XML文档作为范例[n]varchar(max)或[n]varbinary(max)的列保留在数据库中,大概作为文件保留在文件体系中,和利用System.Xml定名空间中的类在两头层或数据库层处置这些文档。.NETFramework中的XML类还可用于操纵以XML数据范例存储的数据。
.NETFramework中的XML类合用于以下情形:
•
会见.NETFrameworkXML的一切功效,如数据流剖析、文档范例界说(DTD)、XSD考证、XSLT处置等。
•
仅仅将SQLServer用作XML文档的数据存储区,不必要在数据库外部举行深切会见。
•
利用.NETFramework中的XML类举行XML文档的年夜多半或全体处置并在文档级举行更新。
可使用[n]varchar(max)、[n]varbinary(max)或XML数据范例来存储XML。
假如利用[n]varchar(max)或[n]varbinary(max),能够取得以下优点:
•
能够保存XML文档的高保真的正本,包含空格和格局。
•
使用程序在对全部文档举行拔出和检索操纵方面能够取得大概完成的最高功能。
前面将先容利用XML数据范例的优点。
在两头层举行XML处置
可使用.NETFramework供应的各类XML类在两头层举行XML处置。如上所述,接纳这类办法时,XML文档能够作为范例[n]varchar(max)的列或XML存储在数据库中,也能够作为文件存储在文件体系中。在两头层,这些文档是从数据库中检索并依据用户的必要举行处置的,以下所述:
•
假如必要读取XML文档,可使用经由过程XmlReader.Create()办法创立的XmlReader来加载从数据库中取得的文档。利用Read()扫瞄文档。XmlReader类供应对XML文档的最快的只读、只向前和非缓冲的会见。
•
假如必要对XML文档举行写进会见并必要对XML数据举行完整扫瞄会见,则可使用XmlDocument类加载和会见XML文档。XmlDocument是文档工具模子(DOM)在.NETFramework中的一种完成,它是XML文档在内存中的树型暗示,利用它能够扫瞄和编纂此文档。
•
假如必要依据DTD/XSD来考证XML文档,大概在运转时取得XSD信息,则可使用XmlReader类。在XmlReaderSettings类上,创立办法时将XsdValidation或DTDValidation设置为True。还能够设置ValidationEventHandle()事务处置程序来处置读取过程当中呈现的考证毛病。
•
假如必要对XML文档使用XSL转换,可使用XPathDocument类加载XML文档,然后利用XslCommand类使用转换。XPathDocument类利用XSLT为XML文档处置供应了疾速的高功能缓存。
•
假如必要利用XPath表达式来查询XML文档,则可使用XPathDocument(只读)或XmlDocument(读/写)来加载XML文档。利用CreateNavigator()办法创立一个XPathNavigator实例,并将所需的XPath表达式作为参数传送给XPathNavigator的Select()办法。
在数据库中举行XML处置
SQLServer2005与CLR的集成使开辟职员也可以利用.NETFramework供应的XML类在数据库层举行处置。这类集成供应了以.NETFramework撑持的任何言语编写存储历程、函数、触发器和用户界说的范例的功效。别的,CLR宿主还供应了会见全部.NETFramework基类库的功效。因而,上一节中先容的各类XML处置选项也能够在数据库中利用。
利用CLR集成的长处以下:
•
它供应了利用面向工具言语(如C#和VisualBasic.NET)以托管代码的情势编写数据库工具的才能。
•
托管的数据库工具比SQLServer初期版本中供应的扩大存储历程更平安。
•
它具有界说用户界说的数据范例和用户界说的算计的才能。
•
在某些情形下,编译的托管数据库工具比Transact-SQL具有更高的功能。
在SQLServer2005中,数据库开辟职员能够选择两种办法来编写存储历程、触发器和用户界说的函数。这两种办法是Transact-SQL和可在.NETFramework中利用的任何言语,如C#或VisualBasic.NET。言语的选择取决于对数据实行的操纵范例。假如代码在举行年夜多半数据会见时只必要利用很少乃至不利用历程逻辑,选择Transact-SQL最符合。托管类最合用于数学性较强的函数和历程,如字符串处置、日期操纵、体系资本会见、文件会见、图象处置等。
在数据库层利用.NETFramework中的XML类的步骤以下:
•
开辟托管程序集。利用可在.NETFramework中利用的任何言语,以程序集的情势完成处置功效,并将程序集打包为DLL。程序集也能够援用其他程序集。
•
注册程序集并授与权限。利用.NETFramework开辟的程序集可使用CREATEASSEMBLYT-SQL语句注册到SQLServer中。注册程序集时,还能够指定要授与该程序集的代码会见权限。利用DROPASSEMBLYT-SQL语句能够作废程序集的注册。
•
向T-SQL公然托管范例。程序集供应的处置功效能够经由过程用户界说的标量函数、用户界说的表函数、用户界说的历程(UDP)大概用户界说的触发器向T-SQL公然。用户界说的标量函数可在任何标量表达式中利用;用户界说的表函数可在任何FROM子句中利用;UDP可在EXEC语句中挪用。
剖析计划
保险理赔包括以数据为主的信息(如理赔ID、政策编号、理赔结算数据等)和以文档为主的信息(如变乱毁伤申明等)。XML文档在搜集以数据为主和以文档为主的信息时功效十分壮大。以后计划的次要请求是必要以XML格局保存一份保险理赔的准确正本。利用SQLServer,经由过程将保险理赔作为范例[n]varchar(max)或[n]varbinary(max)的列存储在数据库中的办法,很简单满意这项请求。值得注重的是,假如必要保存可有可无的空格、属性按次、定名空间前缀和XML声明等信息,则不该利用XML数据范例存储文档。
长处
利用[n]varchar(max)或[n]varbinary(max)作为存储前言,利用System.Xml定名空间中的类处置XML文档的长处以下:
•
能够天真地对XML文档的计划举行变动。在统一列中利用分歧的计划存储XML文档时十分有效。
•
当利用[n]varchar(max)或[n]varbinary(max)存储XML时,能供应高保真的XML文档。此功效关于处置功令文档(如保险理赔)的使用程序多是必不成少的。
•
与将XML实例作为文件存储在文件体系中比拟,还能够使用数据库的功效,如事件更新、并发会见、备份、复制等。
•
因为这类办法不依附于数据库供应的XML撑持,因而很简单对使用程序举行扩大,以撑持多种数据库服务器,如SQLServer、Oracle等。
•
可使用客户端体系的处置才能,从而加重了服务器的负载。经由过程在两头层举行CPU麋集的XML处置,加重了服务器的负载,使其可以用于其他主要的义务。
•
在文档级举行拔出和检索操纵方面供应了大概完成的最好功能。
•
庞大的操纵(如XSL转换)能够作为存储历程、触发器或函数在数据库中完成。
限定
利用[n]varchar(max)或[n]varbinary(max)举行存储,利用System.Xml定名空间中的类处置XML实例的限定总结以下:
•
与XML数据范例(请拜见SQLServer2005中的XML数据范例一节)或SQLXML选项(请拜见SQLXML一节)比拟,编码的庞大性较高。即便数据库逻辑十分复杂,在两头层或数据库层用代码来完成XML的剖析和处置也很庞大。
•
完成此办理计划的代码量很年夜。因而,与SQLXML选项比拟,保护本钱也较高。
•
因为XML文档作为[n]varchar(max)存储在数据库中,因而不克不及对XML文档举行深切地更新、拔出或删除操纵。查询才能也无限。
•
以[n]varchar(max)数据范例存储的XML文档最年夜不克不及凌驾2GB。
•
依据XML内容搜刮以这类办法存储的文档列的价值十分高。
利用.NETFramework中的XML类的示例
思索本文后面先容的保险理赔计划。一旦理赔取得同意,保险公司将存储理赔信息,以便用于功令用处。理赔信息能够作为[n]varchar(max)数据范例存储在数据库中。
使用程序的流程以下:
1.
处置理赔后,使用程序同意或回绝理赔。
2.
利用System.Xml定名空间中的类,为理赔天生XML文档。
3.
将天生的XML文档发送到存储历程。
4.
存储历程将XML文档拔出到表中。
以下代码示例利用体系取得的理赔具体信息天生一个XML文档并将该XML文档拔出到数据库中。
usingSystem;
usingSystem.Xml;
usingSystem.IO;
usingSystem.Text;
usingSystem.Data;
usingSystem.Data.SqlClient;
namespaceInsuranceClaim
{
classInsurance
{
staticvoidMain(string[]args)
{
Insurance.InsertInsuranceClaim();
}
staticvoidInsertInsuranceClaim()
{
StringWriterstrWriter=null;
XmlWriterwriter=null;
XmlWriterSettingssettings=null;
SqlConnectionconnection=null;
SqlCommandcommand=null;
try
{
strWriter=newStringWriter();
settings=newXmlWriterSettings();
//利用缩进功效以加强可读性。
settings.Indent=true;
settings.Encoding=System.Text.Encoding.UTF8;
writer=XmlWriter.Create(strWriter,settings);
//编写XML声明。
writer.WriteStartDocument();
writer.WriteStartElement("InsuranceClaim");
writer.WriteStartElement("ClaimInfo");
writer.WriteElementString("ClaimID","C1234");
writer.WriteElementString("ClaimType","3");
writer.WriteStartElement("SettlementDetails");
writer.WriteStartElement("PaymentDetails");
writer.WriteElementString("PaidTo","Jeff");
writer.WriteElementString("Amount","2000");
writer.WriteElementString("Date","05/12/2002");
writer.WriteElementString("ApprovedBy","Mike");
writer.WriteEndElement();//PaymentDetails停止
writer.WriteEndElement();//SettlementDetails停止
writer.WriteEndElement();//ClaimInfo停止
writer.WriteStartElement("DamageReport");
writer.WriteString("Minoraccidentoccuredon");
writer.WriteElementString("Address","ABCStreet,SampleCity,SampleState");
writer.WriteString("dueto");
writer.WriteElementString("Cause","badweather");
writer.WriteString("resultedindamageto");
writer.WriteElementString("DamagedItem","HeadLights");
writer.WriteElementString("DamagedItem","Engine");
writer.WriteEndElement();//DamageReport停止
writer.WriteEndElement();//InsuranceClaim停止
writer.WriteEndDocument();
//将XML写进文件并封闭写进程序。
writer.Flush();
connection=newSqlConnection();
connection.ConnectionString=@"server=localhost;
database=AdventureWorks;IntegratedSecurity=SSPI;";
command=connection.CreateCommand();
command.CommandText="InsertInsuranceClaim";
command.CommandType=System.Data.CommandType.StoredProcedure;
command.Parameters.Add("@CustomerID",
System.Data.SqlDbType.Char);
command.Parameters.Add("@Claim",
System.Data.SqlDbType.VarChar);
Stringxml=strWriter.ToString();
stringstrCustomerID="1001";
command.Parameters[0].Value=strCustomerID;
command.Parameters[0].Size=strCustomerID.Length;
command.Parameters[1].Value=xml;
command.Parameters[1].Size=xml.Length;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
finally
{
if(connection.State==ConnectionState.Open)
connection.Close();
if(writer!=null)
writer.Close();
if(strWriter!=null)
strWriter.Close();
}
}
}
} 上面是用于创立数据库表的剧本:
CREATETABLE[InsuranceClaim](
[CustomerID][char](4)NOTNULL,
[Claim][varchar](max)NOTNULL,
[ModifiedDate][datetime]NOTNULLDEFAULT(getdate())
) 以下存储历程用于将XML文档拔出到数据库中。
CREATEPROCEDURE[dbo].[InsertInsuranceClaim]
@CustomerID[char](4),
@Claim[varchar](max)
AS
BEGIN
SETNOCOUNTON;
INSERTINTO[InsuranceClaim](CustomerID,Claim)
VALUES(@CustomerID,@Claim)
END; 4、SQLXML
SQLXML是与SQLServer2000一同引进的,它包括在客户端处置XML所需的全体功效。它是一组使SQLServer数据库中的干系数据可以与XML形貌的干系布局数据无缝集成的库和手艺。
在SQL2000问世之前,开辟职员必需为干系数据与XML格局的数据之间的交互供应代码层。SQLXML的呈现使这类操纵变得很复杂,由于它在干系数据与XML之间供应了链接。本文只会商SQLXML托管类。有关该库其他功效的合用性的具体信息,请拜见MSDN网站上的SQLXML页。
SQLXML包括良多在SQLServer中引进的撑持XML的功效。包含:
•
在客户端将查询了局转换为XML
•
利用带讲明的XSD映照计划文件创立干系数据的XML视图,使您可以:
•
针对该XML视图界说XPath查询
•
利用被称为“更新程序”的XML模板,对数据库中的数据举行拔出、更新或删除
•
举行XML海量加载操纵
•
利用HTTP会见SQLServer,使您可以:
•
在URL中指定SQL语句
•
在URL中指定模板查询
•
在URL中指定模板文件
•
在URL中指定针对带讲明的XSD映照计划文件编写的XPath查询
•
以基于SOAP的Web服务情势公然存储历程、用户界说的函数和模板查询所供应的功效。
•
在.NETFramework中编写代码,以便当用SQLXML经由过程SQLXML托管类所供应的XML功效
客户端XML格局化。在客户端指定FORXML子句,可使两头层在由服务器前往的行汇合长进行FORXML转换,以呼应查询。要在客户端举行XML格局化:
•
假如利用SQLXML托管类,则将SqlXmlCommand工具的ClientSideXml属性设置为True。
•
假如利用SQLXMLOLEDB供应程序,则将ClientSideXML供应程序独有的属性设置为True。
•
假如利用模板查询,则在模板中指定client-side-xml="1"。
•
假如利用HTTP会见SQLServer,则在Settings(设置)选项卡中的假造目次下选择RunontheClient(在客户端运转)选项。
•
在客户端上,FORXML供应的无效XML格局化形式为RAW、NESTED和EXPLICIT。利用RAW形式时,所失掉的XML文档在查询了局的每行中都包括一个XML元素,而与行对应的每列中都包括一个属性。当指定NESTED形式时,基表名将作为所失掉的XML文档的元素名前往。EXPLICIT形式同意在查询中指定所需的XML格局,因而可以天生任何格局的XML文档。
•
XML视图。XML视图是利用带讲明的XSD计划创立的,该计划界说了干系数据与XML数据之间的映照。可使用XPath查询对这些XML视图举行查询。经由过程XML视图公然的干系数据也能够被修正,然后利用更新程序将所举行的修正提交到数据库。别的,XML视图还可借助基于COM的XMLBulkLoad(XML海量加载)工具将大批XML文档拔出到数据库中。
•
利用HTTP会见SQLServer。SQLXML供应了一个名为“IIS假造目次办理”的工具,该工具可用于设置一个IIS假造目次,经由过程HTTP公然SQLServer的XML功效。借助SQLISAPI扩大的功效,它撑持在URL中间接指定SQL语句、存储历程、模板查询、模板文件和XPath查询。
•
SQLXML中的Web服务撑持。SQLXML3.0中增添了一项功效,即撑持以基于SOAP的Web服务情势公然SQLServer的功效。此功效使SQLServer可以从客户端吸收SOAPHTTP哀求,以便实行存储历程、用户界说的函数和模板。
•
SQLXML托管类。利用SQLXML托管类,能够在.NETFramework中会见SQLXML功效。SQLXML中有三种托管类:
•
SqlXmlCommand-处置数据库毗连和查询实行
•
SqlXmlParameter-匡助指定查询中的参数
•
SqlXmlAdapter-便于与.NETFramework中的数据集举行交互
利用SQLXML托管类,您能够:
•
利用FORXML子句实行SQL查询
•
针对映照计划实行XPath查询
•
实行模板查询
•
实行模板查询文件
•
实行更新程序
•
实行辨别程序
利用SQLXML将干系数据作为XML文档公然十分合用于以下情形:
•
使用程序吸收布局优秀且能较好地映照到干系表中的XML数据。
•
使用程序必需未来自内部使用程序的大批XML文档加载到数据库中,并坚持其干系格局。
•
使用程序不必要保存文档的按次。
•
使用程序必要以分歧的格局向多个数据利用者供应不异的数据。
•
DML操纵的功能关于使用程序相当主要。
•
使用程序必要充实使用优化程序举行查询优化。
•
使用程序必要举行深切的数据操纵。
•
使用程序必要以XML的情势公然现有的干系数据。
剖析计划
在XML利用计划中先容的第一个数据互换计划(请拜见计划2:汽车打造商与零件供给商之间的数据互换I一节),一个汽车打造商与多个零件供给商之间的交互是利用SQLXML的典范案例。打造商必需与分歧的供给商举行通信以便互换发票数据。倡议的办理计划利用Web服务和SQLXML来办理此成绩。打造商公然一个Web服务,供给商可以使用该服务将发票发送给打造商。Web服务利用了一个针对客户的XSLT,将发票由供给商的格局转换为打造商利用的通用格局。然后,Web服务利用XML视图来分化XML文档,将发票文档的内容映照到干系表中的列。老式的发票处置体系将可以从干系表当选取数据并举行处置。在此计划中利用XML视图的长处以下:
•
下降了保护本钱。经由过程修正针对供给商的XSLT文件,很简单顺应供给商对发票计划所举行的任何变动。
•
与FORXML比拟,编码的庞大水平下降了(请拜见干系/XML集成的服务器端撑持(FORXML/OPENXML)一节)。
•
经由过程创立针对供给商的XSLT文件,很简单撑持新的供给商。
长处
利用SQLXML的长处总结以下:
•
与服务器真个FORXMLEXPLICIT比拟,创立带讲明的映照计划将干系数据映照到XML数据是一种绝对复杂、易于保护的办理计划。
•
SQLXML可以创立可更新的双向XML视图,而利用FORXML只能创立干系数据的只读XML暗示情势。
•
映照XSD便于顺应XML格局的变动哀求,而不用举行主代码的变动。这会使保护复杂易行。
•
SQLXML同意用户经由过程将SqlXMLCommand类的ClientSideXML属性设置为True,在客户端举行XML格局化,从而加重服务器的负载。
限定
从倒霉的方面来看,从客户端利用SQLXML有一些限定:
•
XML视图不合用于XML文档的条理布局过量大概递回深度未知的情形。
•
SQLXML不合用于包括夹杂内容标志和有序数据的申明性文档,比方产物目次、旧事呈报等。
•
因为不克不及保存文档按次,很难从头机关出原始的XML文档。
•
固然将XML文档分化到干系表中供应了出色的搜刮功能,可是在干系数据与XML之间举行互相转换的价值十分高贵。
•
当在XSD映照计划中利用默许映照时,大概会公然数据库表名和列信息,这大概偶然中形成信息泄露。这类风险能够经由过程为表和列指定明白的映照加以免。
•
URL中的SQL语句只能用于可托的局域网中。在Internet上利用这类查询大概招致潜伏的平安成绩。
利用SQLXML的示例
以上提要先容了SQLXML的功效,上面将具体剖析一个能够使用SQLXML托管类的示例。思索一个复杂的示例-为特定客户导出发卖定单的具体信息。该示例所用的表能够在AdventureWorks数据库中取得。
数据库中的数据必需可以在客户端以XML格局取得,并能被暗示层显现。上面您将看到,怎样利用SQLXML类将SQL数据库中的干系数据作为XML数据举行处置。该示例利用映照XML计划举行处置,并将XML节点名映照到表字段。有关利用SQLXML托司库处置干系数据的具体信息,请拜见MSDN网站上的SQLXML页。
以下带讲明的XSD计划界说了干系表[Sales.Customer]、[Sales.SalesOrderHeader]和[Sales.SalesOrderDetail]与客户发卖定单具体信息的方针XML暗示之间的映照。还可使用XSD映照计划来界说XML中的父子干系,如以下XSD计划所示。
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationshipname="CustomerOrderHeader"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID"/>
<sql:relationshipname="OrderHeaderOrderDetail"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:elementname="Customer"sql:relation="Sales.Customer">
<xsd:complexType>
<xsd:sequence>
<xsd:elementname="Order"sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustomerOrderHeader"maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:elementname="OrderDetail"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderHeaderOrderDetail"
maxOccurs="unbounded">
<xsd:complexType>
<xsd:attributename="SalesOrderID"
type="xsd:integer"/>
<xsd:attributename="ProductID"type="xsd:integer"/>
<xsd:attributename="OrderQty"type="xsd:integer"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attributename="SalesOrderID"type="xsd:integer"/>
<xsd:attributename="CustomerID"type="xsd:integer"/>
<xsd:attributename="OrderDate"type="xsd:date"/>
<xsd:attributename="ShipDate"type="xsd:date"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attributename="CustomerID"type="xsd:integer"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
classExportOrders
{
///<择要>
/// 此办法利用SqlXmlCommand类从
/// Sales.Customer、Sales.SalesOrderHeader和Sales.SalesOrderDetail
/// 表当选择纪录。数据是从服务器猎取并在客户端
/// 格局化为xml的。请注重,ClientSideXml设置为True。
///<择要>
staticvoidMain(string[]args)
{
if(args.Length<1)
{
Console.WriteLine("Usage");
Console.WriteLine("CustomerOrders<CustomerID>[OrderID]");
return;
}
try
{
StringBuilderstrBuilder=newStringBuilder();
strBuilder.Append("/Customer[@CustomerID=");
strBuilder.Append(args[0]);
strBuilder.Append("]");
if(args.Length>1)
{
strBuilder.Append("/Order[@SalesOrderID=");
strBuilder.Append(args[1]);
strBuilder.Append("]");
}
SqlXmlCommandxmlCommand=newSqlXmlCommand(@"Provider=
SQLOLEDB;Server=localhost;database=AdventureWorks;
IntegratedSecurity=SSPI;");
xmlCommand.ClientSideXml =true;
xmlCommand.RootTag ="CustomerOrders";
xmlCommand.SchemaPath =@"CustomerOrderDetails.xsd";
xmlCommand.CommandType =SqlXmlCommandType.XPath;
xmlCommand.CommandText =strBuilder.ToString();
Streamreader =xmlCommand.ExecuteStream();
FileStreamfsOut=File.Create("CustomerOrder.xml");
StreamWritersw=newStreamWriter(fsOut);
using(StreamReadersr=newStreamReader(reader))
{
sw.Write(sr.ReadToEnd());
}
sw.Flush();
sw.Close();
fsOut.Close();
}
catch(Exceptionexception)
{
Console.WriteLine(exception.ToString());
}
}
} 上述办法为作为使用程序命令行参数指定的客户ID导出了发卖定单的具体信息。数据在客户端转换为XML格局,从而制止了服务器真个功能成绩。请注重,上述带讲明的XSD计划映照必需保留为CustomerOrderDetails.xsd,才干使上述代码片断一般运转。
注重:今后示例中能够看出,用于从数据库中检索XML数据的代码十分少。
5、干系/XML集成的服务器端撑持(FORXML/OPENXML)
SQLServer经由过程SELECT语句的FORXML扩大功效,撑持在服务器端以XML文档的情势前往SQL查询了局。别的,关头字OPENXML还可以供应从XML文档中提取行汇合的才能。
FORXML
服务器真个FORXML撑持四种XML转换形式-RAW、AUTO、EXPLICIT和PATH。
默许情形下,RAW形式将查询了局会合的每行映照到一个XML元素,并将行中的每列映照到一个属性。当利用ROW形式指定ELEMENTS选项时,行中的每列将被映照到为该行天生的元素的子元素中。还能够经由过程指定XMLSCHEMA选项为所天生的XML哀求一个内联计划。
AUTO形式撑持天生嵌套的XML元素,默许情形下,FROM子句中的每一个表(在SELECT子句中最少列出一列)将映照到一个XML元素,SELECT子句中的列将映照到属性(假如指定ELEMENTS选项,则映照到子元素)。
EXPLICIT形式可以最年夜限制地把持由查询了局天生的XML的格局。利用它,您能够经由过程在查询中指定所需的XML格局来天生任何格局的XML。
利用EXPLICT形式编写庞大的XML文档是相称烦琐的。假如不想编写庞大的EXPLICIT形式哀求,还可使用PATH形式,该形式还具有编写嵌套FORXML查询和TYPE指令以前往XML范例实例的才能。PATH形式经由过程将列名注释为相似XPath的语法,将SELECT查询前往的行汇合中的列映照到属性和子元素。有关SQLServer2005中FORXML加强功效的具体信息,请拜见WhatsNewinFORXMLinMicrosoftSQLServer2005白皮书。
OPENXML
OPENXML与sp_xml_preparedocument和sp_xml_removedocument体系存储历程配合供应了XML文档的干系行汇合视图。为了对XML文档利用OPENXML,必需利用sp_xml_preparedocument创立XML文档的一个内存中暗示。此存储历程利用MSXML剖析器剖析XML文档,并向XML文档前往一个可用于OPENXML的句柄。如今,XML文档句柄、行形式(将XML数据的节点映照到行的XPath表达式)、行汇合计划和行汇合列与XML节点之间的映照等参数都能够传送到OPENXML以取得行汇合。当不再必要XML文档时,必需利用sp_xml_removedocument存储历程将其从内存中卸载。
FORXML的加强功效
在SQLServer2005中,FORXML加强了以下功效:
•
利用新的TYPE指令转换FORXML了局的范例
•
将FORXML的了局分派给各类范例的XML
•
对FORXML查询举行嵌套处置,以天生XML条理布局
•
利用新的PATH形式天生庞大的XML文档
•
利用XMLDATA和XMLSCHEMA选项分离天生XDR或XSD格局的内联计划
•
在RAW形式下利用ELEMENTS指令天生以元素为主的XML
•
在ELEMENT指令中利用XSINIL选项,将NULL值映照到属性为xsi:nil="true"的元素
OPENXML的加强功效
在SQLServer2005中,OPENXML的功效失掉了加强,撑持以下功效:
•
将XML范例数据传送到sp_xml_preparedocument
•
在WITH子句中利用新数据范例
利用FORXML和OPENXML编写和分化XML文档十分合用于以下情形:
•
使用程序必要依照必定的干系存储数据,并将此信息以XML的情势公然给另外一个使用程序。
•
使用程序不必要保存XML的按次。
•
使用程序要实行大批元素级DML操纵。
•
使用程序必要举行深切的数据会见和更新。
•
使用程序必要经由过程Web服务公然干系数据。
剖析计划
计划3中的请求(请拜见计划3:汽车打造商与零件供给商之间的数据互换II一节)是供应一种Web服务,使供给商可使用该服务取得发票的形态大概取得付款申明的正本。FORXML与Web服务分离,供应了一种办理计划,同意打造商在Internet上公然这些服务。供给商可使用Web服务查询其发票的形态。然后,Web服务将利用供给商供应的发票ID,并利用FORXML语句从干系数据中天生XML格局的呼应。天生的XML文档将前往给供给商。在以后计划中,利用基于FORXML语句的办法具有以下长处:
•
FORXML供应了一种从干系数据中静态编写复杂XML文档的复杂办法。
•
当用于编写复杂的XML文档时,FORXML查询较XML视图更容易于保护。
长处
利用FORXML/OPENXML的长处以下:
•
FORXML供应了一种在服务器上从干系数据天生XML的复杂办法。
•
FORXML供应了经由过程Web服务公然贸易信息的才能。
•
利用OPENXML,能够将行汇合以XML格局传送给存储历程,这将使您可以在一个收集往复中举行大批的INSERT、UPDATE和DELETE操纵。
•
FORXML与XSL分离,可用于使用程序集成或贸易集成。
限定
利用FORXML/OPENXML编写和分化XML文档的限定以下:
•
利用FORXML的EXPLICT选项机关XML的布局十分坚苦。
•
很难保护利用FORXMLEXPLICIT编写的庞大查询。
•
由FORXMLAUTO天生的XML文档大概会公然数据库表名和列信息,招致偶然中泄露信息。这类情形能够经由过程为表和列指定别号加以免。
利用FORXML和OPENXML的示例
以下示例利用SQLServer2005附带的AdventureWorks数据库。此示例利用FORXML为指定局限内的客户从[Sales.Customer]、[Sales.SalesOrderHeader]、[Production.Product]和[Sales.SalesOrderDetail]表中取得客户、定单和定单具体信息等信息。
示例:利用FORXML
SELECTCust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
Detail.SalesOrderID,Detail.LineNumber,Detail.ProductID,
Product.Name,
Detail.OrderQty
FROMSales.CustomerCust,
Sales.SalesOrderHeaderOrderHeader,
Sales.SalesOrderDetailDetail,
Production.ProductProduct
WHERECust.CustomerID=OrderHeader.CustomerID
AND OrderHeader.SalesOrderID=Detail.SalesOrderID
AND Detail.ProductID=Product.ProductID
AND (Cust.CustomerIDBETWEEN44AND46)
ORDERBYOrderHeader.CustomerID,
OrderHeader.SalesOrderID
FORXMLAUTO 查询了局以下:
<CustCustomerID="44">
<OrderHeaderCustomerID="44"SalesOrderID="53575">
<DetailSalesOrderID="53575"LineNumber="2"ProductID="952"OrderQty="2">
<ProductName="Chain"/>
</Detail>
<DetailSalesOrderID="53575"LineNumber="1"ProductID="969"OrderQty="1">
<ProductName="Touring-1000Blue,60"/>
</Detail>
<DetailSalesOrderID="53575"LineNumber="3"ProductID="972"OrderQty="1">
<ProductName="Touring-2000Blue,54"/>
</Detail>
</OrderHeader>
<OrderHeaderCustomerID="44"SalesOrderID="59024">
<DetailSalesOrderID="59024"LineNumber="1"ProductID="972"OrderQty="3">
<ProductName="Touring-2000Blue,54"/>
</Detail>
<DetailSalesOrderID="59024"LineNumber="2"ProductID="957"OrderQty="2">
<ProductName="Touring-1000Yellow,60"/>
</Detail>
</OrderHeader>
</Cust>
<CustCustomerID="46">
<OrderHeaderCustomerID="46"SalesOrderID="48354">
<DetailSalesOrderID="48354"LineNumber="1"ProductID="730"OrderQty="1">
<ProductName="LLRoadFrame-Red,62"/>
</Detail>
</OrderHeader>
</Cust> 以下示例利用OPENXML和XPath表达式提取XML文档中指定的定单具体信息。
示例:利用OPENXML
DECLARE@XmlDocumentHandleint
DECLARE@XmlDocumentnvarchar(max)
SET@XmlDocument=N<ROOT>
<CustCustomerID="44">
<OrderHeaderCustomerID="44"SalesOrderID="53575">
<DetailSalesOrderID="53575"LineNumber="2"ProductID="952"OrderQty="2">
<ProductName="Chain"/>
</Detail>
<DetailSalesOrderID="53575"LineNumber="1"ProductID="969"OrderQty="1">
<ProductName="Touring-1000Blue,60"/>
</Detail>
<DetailSalesOrderID="53575"LineNumber="3"ProductID="972"OrderQty="1">
<ProductName="Touring-2000Blue,54"/>
</Detail>
</OrderHeader>
<OrderHeaderCustomerID="44"SalesOrderID="59024">
<DetailSalesOrderID="59024"LineNumber="1"ProductID="972"OrderQty="3">
<ProductName="Touring-2000Blue,54"/>
</Detail>
<DetailSalesOrderID="59024"LineNumber="2"ProductID="957"OrderQty="2">
<ProductName="Touring-1000Yellow,60"/>
</Detail>
</OrderHeader>
</Cust>
<CustCustomerID="46">
<OrderHeaderCustomerID="46"SalesOrderID="48354">
<DetailSalesOrderID="48354"LineNumber="1"ProductID="730"OrderQty="1">
<ProductName="LLRoadFrame-Red,62"/>
</Detail>
</OrderHeader>
</Cust>
</ROOT> --创立XML文档的外部暗示。
EXECsp_xml_preparedocument@XmlDocumentHandleOUTPUT,@XmlDocument
--利用OPENXML行汇合供应程序实行SELECT语句。
SELECT*
FROMOPENXML(@XmlDocumentHandle,/ROOT/Cust/OrderHeader/Detail,2)
WITH(CustomerID varchar(10)../@CustomerID,
OrderID int ../@SalesOrderID,
LineNumber int @LineNumber,
ProductID int @ProductID,
Quantity int @OrderQty) --删除外部暗示。
EXECsp_xml_removedocument@XmlDocumentHandle 查询了局以下:
--------------------------------------------------------
CustomerID OrderID LineNumber ProductID Quantity
--------------------------------------------------------
44 53575 2 952 2
44 53575 1 969 1
44 53575 3 972 1
44 59024 1 972 3
44 59024 2 957 2
46 48354 1 730 1
-------------------------------------------------------- 6、SQLServer2005中的XML数据范例
XML数据的条理布局特征使其很难被建模成干系数据,由于这会使数据布局变得十分庞大(如条理的深度将增添等)。并且,当XML数据映照到干系数据时,也没法保存XML实例中的元素按次,因而从分化失掉的干系数据编写原始的XML文档价值相称高。因为干系模子对存储XML数占有诸多限定,因而在外部存储XML实例是一种较幻想的办法。外部XML实例不会受干系模子的限定,并能供应多种功效,比方可以处置条理布局或嵌套数据、可以保存元素按次、可以间接存储和检索XML数据和可以天真地撑持多种计划等。
MicrosoftSQLServer2005为XML数据处置供应了普遍撑持。利用SQLServer2005,XML值可存储在外部的XML数据范例列中,能够依据XML计划的汇合设置其范例,也能够不设置范例。还能够经由过程XQuery和XMLDML撑持深切的数据处置,后者是针对数据修正的扩大。别的,还能够为XML列创立索引,以进步查询功能。
有范例的XML
有范例的XML十分合用于具有形貌XML数据的XML计划的情形。在这些情形下,能够将XML计划的汇合与XML列联系关系,以天生有范例的XML。对XML范例列的考证是依据与该列联系关系的XML计划汇合举行的。别的,包括有范例的XML数据的查询比包括无范例的XML数据的查询的功能要好,由于它不必要在运转时转换节点值。
无范例的XML
无范例的XML合用于无方案但不想让服务器考证数据的情形,大概没无方案的情形。鄙人列情形下,即便无方案,大概也要存储无范例的XML:
•
没有流动的计划
•
在服务器端存储数据之前,已在客户端举行考证
•
一时存储依据计划断定有效的XML数据
•
利用服务器端不撑持的计划组件(如key/keyref)
即便无范例的XML文档不与任何计划联系关系,体系仍要对其举行反省,以确保其格局优秀。值得注重的是,因为无范例的XML必要在运转时转换节点值,其功能会遭到必定的影响,由于节点值是作为Unicode字符串外部存储的。
XML数据范例的利用计划
利用SQLServer2005中的新XML数据范例,能够完成以下功效:
•
创立既包括干系列,又包括有XML范例列的表。
•
经由过程与XML计划汇合联系关系,创立有范例的XML列范例。
•
对触及其他XML或非XML范例列的XML列举行限定,以强迫完成营业划定规矩。
•
创立可用于存储XML数据范例实例的XML范例的变量。
•
为存储历程或用户界说的函数创立XML范例的参数。
•
从用户界说的函数中前往XML范例值。
•
将利用新的TYPE指令取得的FORXML查询了局分派给XML范例的变量。
•
运转XQuery子集,在XML布局外调询并转换XML数据。
•
依据XML范例的列创立盘算列。
•
为XML范例的列创立XML索引,以进步查询功能。
•
利用XMLDML对XML实例举行元素级的拔出、删除和更新操纵。
•
将XML范例数据的实例传送到sp_xml_preparedocument,以筹办XML文档的内存中暗示。
•
利用XQuery和XMLDML编写包括干系和XML列的跨域查询。
•
利用CAST和CONVERT,分离将XML范例转换为varchar或nvarchar范例。
•
利用CAST或CONVERT,将字符串数据范例(如[n]varchar、[n]text、varbinary和image)转换为XML范例。
XML数据范例办法和XMLDML
能够经由过程五种办法对XML数据范例列举行查询和处置。利用XML数据范例的query()办法,能够提取XML文档的片断;query()办法承受XQuery表达式作为参数,并前往无范例的XML实例;利用value()办法,经由过程指定XQuery表达式和必要前往的SQL范例,能够从XML实例中提取标量值;利用exist()办法,能够反省XML实例是不是存在;利用nodes()办法,能够便利地将XML文档分化为干系数据。
利用modify()办法,能够对XML实例举行数据处置。经由过程XQuery中增加的insert、delete和update关头字供应了对XMLDML的撑持。利用insert、delete和update关头字能够分离拔出、删除和更新一个或多个节点。
XML索引
假如XML实例十分年夜,那末在对XML数据范例列实行查询处置操纵时所举行的剖析和分化大概要延续相称长的工夫。在这些列上创立索引将进步对XML数据范例的查询功能。XML数据的巨细和利用计划对断定所需的索引范例十分主要。SQLServer撑持两品种型的索引-主XML索引和次XML索引;没有前者,后者就不克不及存在。
在XML列上创立主XML索引,将分化XMLBLOB并将这些值存储在一个外部表中。如许,因为运转时不用举行分化,就能够进步运转时的查询功能。依据利用计划的分歧,还能够创立次XML索引,进一步进步查询功能。能够创立三品种型的次XML索引-PATH、PROPERTY和VALUE,分离进步路径、属性和值的查询功能。有关为XML范例列选择得当的次索引的办法,请拜见“PerformanceOptimizationsfortheXMLDataType”白皮书。
将XML文档存储为XML数据范例十分合用于以下情形:
•
使用程序必要保存XML实例的信息集内容。XML文档的信息集内容包含文档条理布局、元素按次、元素值及属性等。使用程序不保存属性按次、定名空间前缀、可有可无的空格和XML声明等信息。
•
使用程序必要对XML文档举行元素级的修正和查询操纵。
•
使用程序必要XML数据范例列的索引,以加速查询处置。
•
XML数据纷歧定无方案。
•
使用程序利用各类布局的XML文档,大概XML文档要切合难以映照到干系布局的各类分歧或庞大计划。
剖析计划
剖析计划:内容办理体系
如今,让我们来剖析一下XML利用计划中先容的内容办理体系。出书公司要处置文本、图象、音频、视频等各类情势的信息。可自力利用的信息块是从各类来历搜集并在数据库中举行保护的。这些信息块被称为“组件”。将各个组件组装起来便可创立文档。文档中要包含哪些组件取决于用户的必要。这些文档将经由过程各类渠道发送给预订的用户。内容办理体系一般必要具有高功能、高可缩放性地存储、检索、搜刮和更新内容的才能。
XML作为一种一致尺度的数据模子供应了一种极好的办法,能够在统一个文档中同时存储XML数据和XML内容。XML还具有将显现体例与数据自己断绝的才能,这一点十分主要,由于不异的信息用于分歧用户的显现体例大概分歧。SQLServer2005供应的内置XML数据范例能够满意这类内容办理体系的必要。经由过程XML数据范例,能够存储XML文档,利用XMLDML在元素级修正XML文档,和利用XQuery对XML文档举行查询。
剖析计划:客户查询拜访
在客户查询拜访XML利用计划中,次要请求是存储具有多种计划的查询拜访信息。不克不及利用一个干系表为没有流动计划的数据建模。包括XML列的干系表是存储此类信息的最好选择。还能够为干系表别的增加一列,用于存储查询拜访范例。经由过程利用查询拜访范例列提取该查询拜访范例的一切纪录,能够对与某品种型查询拜访相干的信息举行剖析。在一样平常的查询拜访中,用户一般不会回覆一切成绩。因而,与其创立多个列(每列对应查询拜访中的一个成绩)并在数据库中为未回覆的成绩存储NULL值,倒不如将每一个客户的查询拜访信息作为XML文档存储在一列中。将客户的查询拜访信息作为XML范例列存储更合适此计划,由于:
•
利用XML范例列,分歧计划的查询拜访信息能够存储在一个XML范例列中。将XML范例列与XML计划汇合联系关系,如许用户就能够为多个查询拜访范例存储数据。
•
查询拜访信息能够在用户界面长进行考证,而不用将此信息作为有范例的XML数据范例列举行存储,从而完成数据库级的考证。
•
XQuery可用于实行数据剖析。
长处
在XML数据范例列中存储XML数据的长处总结以下:
•
XML数据范例供应了一种在服务器上存储XML数据的复杂直不雅的办法,同时还保存了文档按次和文档布局。这一点出格合用于文档按次和文档布局十分主要的文档。假定一个复杂的计划:使用程序从某个数据源取得了一个XML文档,而且要存储该文档。将其存储在nvarchar或text列都不克不及包管XML的格局优秀,并且不克不及容易会见其内容。在这类情形下,最好将传进的XML文档存储在外部的XML列中。
•
XML数据范例可以对XML数据举行深切的查询和修正操纵。在SQLServer2005之前,没有举措在数据库外部存储XML。因而,假如要修正或查询XML数据,必需从nvarchar或text列中加载数据,由字符串创立XML文档,然后才干举行修正。将修正过的数据写回数据库的步骤与此相似。而如今利用XML数据范例,这些步骤就变得十分复杂。
•
利用XML数据范例,能够为XML数据范例列创立索引,从而加速查询处置。
•
利用XML数据范例时,能够对XML数据利用XML计划汇合和限定,从而强迫完成营业划定规矩。XML计划可用于考证数据,增加基于范例的操纵语义,在编写查询和数据修正语句过程当中举行比无范例的XML更准确的范例反省,而且能够优化存储和查询处置。
•
因为XML范例的数据存储在数据库中,因而它还具有良多数据库的功效,如备份和恢复、SQLServer平安性、事件、日记等。
限定
以下是利用新的XML数据范例时必需懂得的一些限定:
•
不克不及存储准确的数据正本。不克不及保存可有可无的空格、定名空间前缀、属性按次和XML声明。
•
XML文档的条理最多为128层。
•
XML文档的外部二进制暗示最年夜为2GB。
•
XML实例不克不及举行对照。因而:
•
XML列不克不及成为主键束缚或外键束缚的一部分。
•
XML列不克不及作为分组值在GROUPBY语句中利用。
•
XML不克不及转换为text、ntext和image数据范例,由于在SQLServer2005中不克不及利用这些范例。可是,XML数据范例能够转换为[n]varchar和[n]varbinary范例。
利用XML数据范例的示例
示例使用程序利用AdventureWorks数据库中的Sales.Store表。Sales.Store表包括CustomerID作为主键,包括Demographics作为XML列。Demographics列包括存储查询拜访信息。存储查询拜访中存储的信息是可选的。这意味着,Demographics列纷歧定包括一切元素。假如不异的信息已存储为干系格局,则必要将这些元素创立为表的列。因为年夜多半存储查询拜访信息是可选的,因而关于年夜多半数据,这些列中将包括NULL值。这将招致表空间的华侈。为了不这类华侈,将Demographics列中的存储查询拜访信息存储为XML格局。Demographics列包括每一个客户的发卖信息,即年发卖额、年支出及银行称号等。这些字段作为XML元素存储在数据中。
示例使用程序具有以下功效:
•
显现一切客户及其查询拜访信息的列表。
•
显现特定客户的查询拜访信息。
•
向Sales.Store表中拔出新客户及其查询拜访信息。
•
修正给定客户的查询拜访信息的某些元素(如年发卖额、年支出等)。
•
删除给定客户的查询拜访信息。
使用程序利用System.Data.SqlTypes.SqlXml类从XML列中检索数据。SQLXML类是对XML列的间接映照。
利用SQLXML类,能够间接从XML列检索数据,而不必要任何映照或转换。
上面,让我们看一个怎样为客户ID12检索年支出元素的示例。以下代码示例展现了上述的第二种功效。
PublicvoidRetreiveAnnualRevenue()
{
SqlConnectionconn=newSqlConnection();
conn.ConnectionString=@"Server=localhost;Database=AdventureWorks;
integratedsecurity=SSPI";
conn.Open();
SqlCommandcommand=conn.CreateCommand();
command.CommandText=@"selectDemographics.query(
declarenamespaceSS="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey"
<StoreInfo>
<AnnualRevenue>
{data(/SS:StoreSurvey/SS:AnnualRevenue)}
</AnnualRevenue>
</StoreInfo>)as
ResultfromSales.StorewhereCustomerID=12";
SqlDataReaderdatareader=command.ExecuteReader();
System.Text.StringBuilderbuilder=newSystem.Text.StringBuilder();
While(datareader.Read())
{
SqlXmlsqlxml=datareader.GetSqlXml(0);
builder.Append(sqlxml.Value);
}
//注重:xml1是一个XMLWeb控件
this.xml1.DocumentContent=builder.ToString();
this.xml1.TransformSource=@"StoreInfo.xslt";
} 上述办法在AdventureWorks数据库中创立了一个SqlConnection工具实例。命令文本属性包括为客户ID12检索年支出字段值的查询。
这是一个XQuery,将在XML列上间接实行。查询的前往值将是一个XML片断,该片断将映照到SQLXML类。然后,可使用SQLXML类的Value属性检索该XML片断。
检索到的XML片断将利用XMLWeb服务器控件显现在客户端使用程序中。
7、分歧办法的对照
功效.NETFramework中的XML类FORXML/OPENXMLSQLXMLXML数据范例<p> 代码的复RDBMS并非没有局限性。它们难以扩展,需要大量的资源来配置和维护,比如时间、硬件和人力。同样,它们往往遵循峰值性能模型,这就要求系统按照峰值容量来配置可用性,而不考虑典型的数据使用情况。
作者:
老尸
时间:
2015-1-19 06:52
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
作者:
变相怪杰
时间:
2015-1-19 06:52
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
作者:
海妖
时间:
2015-1-28 05:24
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
作者:
只想知道
时间:
2015-2-5 16:53
代替了原来VB式的错误判断。比Oracle高级不少。
作者:
透明
时间:
2015-2-13 01:34
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
作者:
谁可相欹
时间:
2015-3-3 12:20
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
作者:
飘飘悠悠
时间:
2015-3-11 11:08
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
作者:
admin
时间:
2015-3-18 10:30
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
作者:
莫相离
时间:
2015-3-25 20:55
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
欢迎光临 仓酷云 (http://www.ckuyun.com/)
Powered by Discuz! X3.2