SQL Server2000提供了OpenXML特性,我们可以很方便的用OpenXML特性来代替传统的行集结果,同样我们也可以使用定义好的XML文档作为输入的数据,这样也为我们的数据移植带来的巨大的便利。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
同时,SQL Server2000中也提供了存储过程,用微软的话说,只有设计成存储过程,才算是”cleaner separation of code from the middle-tier”,这样做是很好的。应用程序访问数据库的数据并不是直接的与数据库表打交道,而是通过存储过程的运行来获取所需要的数据。这样的设计有一个好处就是,避免了频繁的表操作,而通过运行在服务器端的存储过程可以极大的提高运作效率和提升访问数据的速度,同时也很好的屏蔽了数据库表的逻辑,使得数据库访问变成了数据库提供的服务访问。
既然OpenXML和存储过程都可以提高SQL Server2000的性能,那么能否把这种技术结合起来了?答案是肯定的,下面我们就来看看怎么在存储过程中使用OpenXML.
以下是一个使用了OpenXML特性的存储过程:
*******************************************************************************
-------------------------------------------------------------------------------
-- upArchiveMsgInsertMsg
-------------------------------------------------------------------------------
/******************************************************************************
这是一个公文消息xml文档的实例
declare @xml varchar(8000)
SET @xml='<?xml version="1.0" encoding="gb2312" ?>
<ArchiveMsg
Title="jiangsuer" UserID="Admin" Author="湖北"
SendTime="<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><date year="2001" day="1" month="1"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">1/1/2001</span></date>" Department="mse"
AttachFile="hust"
ReceiveList="younther" Body="hustwelcome">
<MsgList UserID="Admin"/>
<MsgList UserID="Anime"/>
<MsgList UserID="Tiger"/>
</ArchiveMsg>'
exec upArchiveMsgInsertMsg @xml
*******************************************************************************/
//这个运行存储过程先在ArchiveMsg表中插入一条公文信息,并根据该条公文信息的MsgID和接受者列表,再在MsgList表插入每个接受者的UserID和MsgID,这些信息从xml中获取。
ALTER PROCEDURE upArchiveMsgInsertMsg
(
@xml varchar(8000)
)
AS
DECLARE @idoc int -- xml doc
DECLARE @MsgID int -- new order
DECLARE @SendTime datetime
-- 解析XML文档
EXEC sp_xml_preparedocument @idoc output, @xml
SET NOCOUNT ON
DECLARE @CurrentError int
BEGIN TRANSACTION
-- 开始更新数据的事务
SELECT @SendTime=SendTime
FROM OpenXML(@idoc, '/ArchiveMsg')
WITH ArchiveMsg
INSERT INTO ArchiveMsg(Title,UserID,Author,SendTime,Department,ReceiveList,Body,AttachFile)
SELECT Title,UserID,Author,SendTime,Department,ReceiveList,Body,AttachFile
FROM OpenXML(@idoc, '/ArchiveMsg')
WITH ArchiveMsg
-- 错误检查
SELECT @CurrentError = @@Error
IF @CurrentError != 0
BEGIN
GOTO ERROR_HANDLER
END
SELECT @MsgID=@@IDENTITY
INSERT INTO MsgList(MsgID,UserID,SendTime)
SELECT @MsgID,UserID,@SendTime
FROM OpenXML(@idoc, '/ArchiveMsg/MsgList')
WITH (
MsgID int,
UserID varchar(80),
SendTime datetime
)
-- 错误检查
SELECT @CurrentError = @@Error
IF @CurrentError != 0
BEGIN
GOTO ERROR_HANDLER
END
-- 事务结束
COMMIT TRANSACTION
SET NOCOUNT OFF
-- 从内存中移除定义的XML文档
EXEC sp_xml_removedocument @idoc
RETURN 0
ERROR_HANDLER:
ROLLBACK TRANSACTION
SET NOCOUNT OFF
-- 从内存中移除定义的XML文档
EXEC sp_xml_removedocument @idoc
RETURN @CurrentError
*******************************************************************************
好了,存储过程就是这样了,我们得测试这个存储过程,测试函数代码如下:
首先我们得生成这个XML文档,为了简便起见,我们就用一个String变量来摸拟XML文档:
public string GetXmlString(ArchiveDetail myMsg,string[] useridList)
{
string xml="<?xml version=\"1.0\" encoding=\"gb2312\" ?>";
xml+="<ArchiveMsg ";
xml+="Title=\""+myMsg.Title+"\" ";
xml+="UserID=\""+myMsg.UserID+"\" ";
xml+="Author=\""+myMsg.Author+"\" ";
xml+="SendTime=\""+myMsg.SendTime.ToString()+"\" ";
xml+="Department=\""+myMsg.Department+"\" ";
xml+="AttachFile=\""+myMsg.AttachFilepath+"\" ";
xml+="ReceiveList=\""+myMsg.ReceiveList+"\" ";
xml+="Body=\""+myMsg.Body+"\">";
foreach(string i in useridList)
{
xml+="<MsgList UserID=\""+i+"\"/>";
}
xml+="</ArchiveMsg>";
return xml;
}
然后就是调用这个存储过程的函数:
public bool SendArchiveMsg(ArchiveDetail myMsg,string[] useridList)
{
string xml=this.GetXmlString(myMsg,useridList);
try
{
SqlParameter[] prams={ data.MakeInParam("@xml",SqlDbType.VarChar,8000,xml)
};
SqlConnection con = new
SqlConnection("server=127.0.0.1;uid=sa;pwd=sa;database=mydatabase");
con.Open();
SqlCommand cmd = new SqlCommand("upArchiveMsgInsertMsg", con);
cmd.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter parameter in prams)
cmd.Parameters.Add(parameter);
cmd.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null));
cmd.ExecuteNonQuery();
con.Close();
int retval = (int)cmd.Parameters["ReturnValue"].Value;
if(retval==0)
return true;
else
return false;
}
catch(Exception ex)
{
Error.Log(ex.ToString());
return false;
}
}
在上述的代码中,代码量比较多,但是实际的处理过程其实比较简单,大致如下:
定义xml文
在存储过程中引入xml,利用sql server的open xml对之处理(具体就是几个与xml相关的函数)
在程序中调用存储过程
结束。
通过这样的方式我们就可以很方便的把xml及sql server结合起来应用。
当然sql server对xml的支持不仅在此,如果有留心的可以看到在IIS中也可以配置sqlxml,相关方面的内容,在后续的文章中会逐渐介绍,在文中有不详尽及不妥之处,还请各位网友批评指正。
分享到:
相关推荐
利用OpenXML获取XML文件中的数据 语法 OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]]) [WITH (SchemaDeclaration | TableName)] 参数。。。。。
SQL Server 2005 核心技术 SQL Server 2005 服务简介 SSAS(Analysis Service)与 商业智能(BI) 数据挖掘算法简介(Data Mining) 联机数据分析技术(OLAP) SSIS (Integration Service)与商业智能(BI) SSRS...
OpenXml在SQL Server 2000数据库中的应用.pdf
在SQL Server中应用OPENXML处理XML (1).pdf
木书简要介绍了XML语言的编写与规范,重点介绍了SQL Server 2005中XML语言的应用,包括XML数据类型、XQuery语言、FOR XML子句、OPENXML函数、XML模板、updategram模板、XML Bulk Load数据批量处理以及XML Web服务等...
掌握SQLServer中有关XML数据管理的基本操作方法,比如如何使用XML数据类型、如何使用五种不同的XML数据类型方法、如何使用for xml子句几种不同的模式完成关系数据到XML数据的转换、如何使用openxml函数或者XML数据...
openxml的理解与扩展,OPENXML 通过 XML 文档提供行集视图。由于OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。
’,’,'</ProjID></item><item><ProjID>’)+'</ProjID></item>’ as xml) EXEC sp_xml_preparedocument @Idoc OUTPUT, @doc SELECT ProjID FROM OPENXML (@Idoc, ‘/Root/item’,2) WITH ( [ProjID] varc
使用OpenXML + ADO.NET将数据插入SQL Server的示例
利用OpenXML实现XML转换成SQL.pdf
OpenXml生成Office报表Demo
OpenXML读写excel方法,如可以修改格式以及添加值到单元格,仅提供读写Excel的类,只需调用其中方法就可以
本来以为通过Microsoft.Office.Interop.Excel来操作Excel的速度已经是很不理想,所以找到了OpenXml,本以为通过这种方式来操作速度应该提升很多吧,谁知试了一下那速度真是相当的慢~~~我分别用两种方式些1000*26个...
在office2007中使用openxml进行控件的开发
主要介绍了C#采用OpenXml给word里面插入图片的方法,参考了MSDN官网的示例加以说明,是OpenXml操作Word的一个非常重要的应用,需要的朋友可以参考下
openxml整理 C#
详细展示了OpenXML对Excel的各种操作
OpenXMLSDK代码生成工具安装包,并有OpenXML2个必要DLL引用,亲测可用,自己项目中应用的,后期会免费释放个人开发经验及代码,如有需要可进行关注。
掌握SQLServer中有关XML数据管理的基本操作方法,比如如何使用XML数据类型、如何使用五种不同的XML数据类型方法、如何使用for xml子句几种不同的模式完成关系数据到XML数据的转换、如何使用openxml函数或者XML数据...
您可以在MySql中使用ExtractValue。 请参阅:12.11。 XML函数[^]