您的位置:首页 > 数据库

如何使用XML格式的参数在SQL server的存贮过程中。

2006-07-26 14:30 302 查看
 
背景:在开发时,有时我们希望能够在客户一次传入一批数据,让存贮过程批量处理。用来代替循环调用存贮过程,减少客户端和数据库的交互。以便可以节省处理时间。
 
解决思路:把需要传递的批量数据(通常是一个数据集)格式化成一个XML流的参数,然后传递这个XML格式的参数到存贮过程。让存贮过程循环处理。
 
解决方案:
利用SQLServer 的OPENXML命令来处理。此命令的主要功能是能读取以XML格式传入的参数。
 
一个例子:(本例中读取后的数据是放入游标中,由游标来控制,循环处理数据)
CREATE PROCEDURE
dbo.UP_BatchPostRMA 
[align=left]([/align]
    @XMLNumbers
text,           -- Save the Rma numbers and So numbers   

[align=left])[/align]
[align=left]AS[/align]
[align=left] [/align]
[align=left]    SET NOCOUNT ON[/align]
[align=left]    -- Define local variables[/align]
    DECLARE
@RMANumber      int,
            @SoNumber      
int
[align=left]    --Read data from xml text. [/align]
   DECLARE
@idoc int    
   
EXEC dbo.sp_xml_preparedocument @idoc OUTPUT, @XMLNumbers   
[align=left]    [/align]
    DECLARE
Rma_Cursor CURSOR LOCAL FAST_FORWARD
FOR
        SELECT
RmaNumber, SoNumber
       
FROM OPENXML (@idoc, '/NewDataSet/Table',2)   --从XML中读取数据RmaNuber,SoNumber。
           
WITH (   
                RmaNumber
int,
               
SoNumber int
[align=left]            )[/align]
[align=left]    [/align]
    OPEN
Rma_Cursor
[align=left]    [/align]
    FETCH NEXT FROM
Rma_Cursor INTO @RMANumber, @SoNumber
[align=left]    [/align]
    WHILE
@@FETCH_STATUS = 0
    BEGIN    

        UPDATE
dbo.CreditForRma
          
SET postdate = GETDATE()
         WHERE
rmanumber = @RMANumber
              
and sonumber = @SoNumber
[align=left] [/align]
        FETCH NEXT FROM
Rma_Cursor INTO @RMANumber, @SoNumber
[align=left]    END[/align]
[align=left]    [/align]
    CLOSE
Rma_Cursor
    DEALLOCATE
Rma_Cursor
[align=left]    [/align]
    EXEC
dbo.sp_xml_removedocument @idoc
[align=left]GO[/align]
[align=left]说明: OPENXML (@idoc, '/NewDataSet/Table',2)。第一个参数:是 XML 文档的内部表式法的文档句柄。通过调用 sp_xml_preparedocument 创建。本例中中通过EXEC dbo.sp_xml_preparedocument @idoc OUTPUT, @XMLNumbers 来得到的。[/align]
[align=left]第二个参数表示:用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。即数据节点是从那个节点开始的。[/align]
[align=left]另:由于客户端是采用DataSet的GetXML方法把包含数据的数据集,序列化成XML格式的文本。数据是存在 /NewDataSet/Table结点下的。NewDataSet 就是DataSet的缺省DataSetName值(你可以重新命名) Table 就是DataSet下table的缺省TableName(也可重新命名)例子使用了缺省值。[/align]
[align=left]第三参数:2表示使用以元素为中心的映射。[/align]
[align=left]其它用法请参见:microsofte的SQL sever所带的帮助文件,那里有详细的说明和例子。[/align]
 
总结:
其实读取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,
[align=left]                SoNumber int[/align]
            ) --解析XML数据。并读出数据
 3 EXEC dbo.sp_xml_removedocument @idoc --删除文档句柄。
 
附:在客户端的调用例子( C# 编码)
SqlConnection sqlConn =
new SqlConnection(connString); //connString:连接字符串。
              SqlCommand sqlCmd =
new SqlCommand("dbo.UP_BatchPostRMA", sqlConn);
[align=left]              sqlCmd.CommandType = CommandType.StoredProcedure;[/align]
              sqlCmd.CommandTimeout = 1800;
// 30分钟 定义是否超时时间
             
// 定义SQL参数
              SqlParameter[] parameters =
new SqlParameter[4];
              parameters[0] =
new SqlParameter("@XMLNumbers", SqlDbType.Text);
[align=left]              [/align]
              parameters[0].Value = ds.GetXml();//
使用GetXml方法,使参数变为一个XML格式的流。
[align=left]              [/align]
             
// 将参数添加到SqlCommand对象中
             
for(int i=0; i<parameters.Length; i++)
[align=left]              {[/align]
[align=left]                   sqlCmd.Parameters.Add(parameters[i]);[/align]
[align=left]              }[/align]
              sqlConn.Open();//
执行调用存贮过程。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息