如何使用XML格式的参数在SQL server的存贮过程中。
来源:互联网 发布:js checkbox prop 编辑:程序博客网 时间:2024/06/07 05:54
背景:在开发时,有时我们希望能够在客户一次传入一批数据,让存贮过程批量处理。用来代替循环调用存贮过程,减少客户端和数据库的交互。以便可以节省处理时间。
解决思路:把需要传递的批量数据(通常是一个数据集)格式化成一个XML流的参数,然后传递这个XML格式的参数到存贮过程。让存贮过程循环处理。
解决方案:
利用SQLServer 的OPENXML命令来处理。此命令的主要功能是能读取以XML格式传入的参数。
一个例子:(本例中读取后的数据是放入游标中,由游标来控制,循环处理数据)
CREATE PROCEDURE dbo.UP_BatchPostRMA
(
@XMLNumbers text, -- Save the Rma numbers and So numbers
)
AS
SET NOCOUNT ON
-- Define local variables
DECLARE@RMANumber int,
@SoNumber int
--Read data from xml text.
DECLARE@idoc int
EXEC dbo.sp_xml_preparedocument @idoc OUTPUT, @XMLNumbers
DECLARERma_Cursor CURSOR LOCAL FAST_FORWARD FOR
SELECTRmaNumber, SoNumber
FROM OPENXML (@idoc, '/NewDataSet/Table',2) --从XML中读取数据RmaNuber,SoNumber。
WITH (
RmaNumberint,
SoNumber int
)
OPEN Rma_Cursor
FETCH NEXT FROMRma_Cursor INTO @RMANumber, @SoNumber
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATEdbo.CreditForRma
SET postdate = GETDATE()
WHERErmanumber = @RMANumber
and sonumber = @SoNumber
FETCH NEXT FROMRma_Cursor INTO @RMANumber, @SoNumber
END
CLOSE Rma_Cursor
DEALLOCATERma_Cursor
EXECdbo.sp_xml_removedocument @idoc
GO
说明: OPENXML (@idoc, '/NewDataSet/Table',2)。第一个参数:是 XML 文档的内部表式法的文档句柄。通过调用 sp_xml_preparedocument 创建。本例中中通过EXEC dbo.sp_xml_preparedocument @idoc OUTPUT, @XMLNumbers 来得到的。
第二个参数表示:用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。即数据节点是从那个节点开始的。
另:由于客户端是采用DataSet的GetXML方法把包含数据的数据集,序列化成XML格式的文本。数据是存在 /NewDataSet/Table结点下的。NewDataSet 就是DataSet的缺省DataSetName值(你可以重新命名) Table 就是DataSet下table的缺省TableName(也可重新命名)例子使用了缺省值。
第三参数:2表示使用以元素为中心的映射。
其它用法请参见:microsofte的SQL sever所带的帮助文件,那里有详细的说明和例子。
总结:
其实读取XML格式的参数由上的例子可看出分三步走
1 EXEC dbo.sp_xml_preparedocument @idoc OUTPUT, @XMLNumbers --获取传入的XML格式参数的文档句柄。
2 SELECT RmaNumber, SoNumber
FROM OPENXML (@idoc,'/NewDataSet/Table',2) --从XML中读取数据RmaNuber,SoNumber。
WITH (
RmaNumber int,
SoNumber int
) --解析XML数据。并读出数据
3 EXEC dbo.sp_xml_removedocument @idoc --删除文档句柄。
附:在客户端的调用例子( C# 编码)
SqlConnection sqlConn = new SqlConnection(connString); //connString:连接字符串。
SqlCommand sqlCmd = new SqlCommand("dbo.UP_BatchPostRMA", sqlConn);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.CommandTimeout = 1800;// 30分钟 定义是否超时时间
// 定义SQL参数
SqlParameter[] parameters =new SqlParameter[4];
parameters[0] = new SqlParameter("@XMLNumbers", SqlDbType.Text);
parameters[0].Value = ds.GetXml();//使用GetXml方法,使参数变为一个XML格式的流。
// 将参数添加到SqlCommand对象中
for(int i=0; i<parameters.Length; i++)
{
sqlCmd.Parameters.Add(parameters[i]);
}
sqlConn.Open();//执行调用存贮过程。
- 如何使用XML格式的参数在SQL server的存贮过程中。
- 如何指定输出参数,当您使用在 sp _ executesql SQL Server 中存储过程
- SQL Server存储过程中如何使用数组参数
- 如何在C#中使用存储过程(SQL Server 2000)
- 在SQL Server的表的触发器中可以调用 SQL Server中的带参数的存储过程吗?
- SQL SERVER如何获取指定数据库中所有存储过程的参数
- SQL Server中使用表类型参数批量添加和修改的存储过程
- SQL SERVER中如何使用输出参数
- SQL server 在OPENQUERY中使用参数
- 在SQL server中使用 XML 实例:
- 在今天的测试过程中,我刚开始使用get方法传递参数,出现乱码,但是使用post传参数好着的,需要在tomcat的server.xml里面进行设置URIEncoding="UTF-8"即可
- 在delphi中如何调用SQL Server的存储过程(转贴)
- 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(
- 在Qt5.4中调用 sql server 2008 的存储过程如何获取返回值
- 如何在SQL Server中从触发器中获取引发该触发器的SQL语句内的相应参数?
- 在SQL语句中“?”参数的使用
- 查询存贮在表中的XML的结点值。
- 在存储过程中如何使用另一个存储过程返回的结果集SQL实例
- Linux Kernel Threads in Device Drivers
- 如何在vc6,vc7,vc8下编译x264
- J2EE Development without EJB笔记
- HTML中的meta
- 滑动的效果(支持各种的浏览器)
- 如何使用XML格式的参数在SQL server的存贮过程中。
- 常用log4j配置
- 不需qq,msn,任何网页都能变成聊天室。
- Delphi语法笔记
- 批处理中替换文本内容
- 高效程序员应该养成的七个习惯
- javascript的一些常用正则表达式
- 我写过的最长的命令
- 整理后的web应用程序汉字显示问题的解决方法