我对XML存储过程的理解

讲XML的这天我没来,对XML了解的不深刻。我就谈谈我是怎么理解的吧。希望不会误导大家。

首先是对于XML,XML有什么用?这个我说不清楚,我把它理解成这样:方便传递数据参数。
一个存储过程需要输入参数,DataTable里如果有5个对象,一个对象5个属性,那就有25个参数。如果更多呢?传递给存储过程就很麻烦。我把XML理解成一个容器,只要传递XML这个容器,即可传递所有的参数。
用DateSet里的GetXml()方法,获得XML。这里可以在.cs文件GetXml()这里设置一个断点,附加到进程调试,用一个字符串去接受:string xml = ds.GetXml(); 观察xml的值,这个就是XML文件内容。然后把XML传递给存储过程即可。
     对于游标,我也不是太熟练。也是第一次接触。不知道大家平时写存储过程的时候有没有遇到过这个错误:对象值不唯一,不能使用<=,=,>=……等运算符。这个时候就需要用游标了。XML文件可以看成一个表格,游标一行一行的取,数据一行一行的读取。读完一行,游标next。直到数据遍历完毕。

     下面是一个存储过程,实现插入工作。大家用以上的思想再看一下,希望会有点帮助。
这个存储过程的输入参数包括了一些普通的输入参数,和一个XML。思想是一样的。
对于解析XML的一些关键字,可以看下联机丛书,或者百度一下。
        ALTER PROC [dbo].[usp_PE_InsertPOList]
(@ApplierID varchar(8),@ApplyOrgID varchar(8),@Remark varchar(500),@RequiredDeliveryDate varchar(50),
@Supplier varchar(50),@ApplyDate varchar(50),@BuyerID varchar(8),@ITComments varchar(500),@PurchaseStatus varchar(50),@xmlPurchaseItems xml)
AS
BEGIN
 DECLARE @docHandle int,
   @PurchaseID varchar(8),
   @PurchaseItemID varchar(8),
   @ProductName varchar(50),@SpecDesc varchar(50),@Purpose varchar(50),
   @Quantity int,@UnitPrice varchar(50),@Amount varchar(50),
   @IntendingDeliveryDate varchar(50)

 EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlPurchaseItems
 --GET XML
 BEGIN TRAN
 BEGIN TRY
  EXEC usp_GetEntityID 'PurchaseID',@PurchaseID OUTPUT

  INSERT INTO PE_PurchaseInfo
  (PurchaseID,ApplierID,ApplyOrgID,Remark,RequiredDeliveryDate,Supplier,ApplyDate,BuyerID,ITComments,PurchaseStatus)
  VALUES(@PurchaseID,@ApplierID,@ApplyOrgID,@Remark,@RequiredDeliveryDate,@Supplier,@ApplyDate,@BuyerID,@ITComments,@PurchaseStatus)
  --INSERT PurchaseInfo
  DECLARE cur cursor FOR
  SELECT * FROM
  OPENXML(@docHandle, N'/NewDataSet/Table1',2)
  WITH(ProductName varchar(50),SpecDesc varchar(50),Purpose varchar(50),
   Quantity int,UnitPrice varchar(50),Amount varchar(50),
   IntendingDeliveryDate varchar(50))
  OPEN cur
  FETCH NEXT FROM cur INTO
   @ProductName,@SpecDesc,@Purpose,@Quantity,@UnitPrice,@Amount,@IntendingDeliveryDate
 WHILE @@FETCH_STATUS = 0
 BEGIN
  EXEC usp_GetEntityID 'PurchaseItemID',@PurchaseItemID OUTPUT
  
  INSERT INTO PE_PurchaseItems(PurchaseItemID,PurchaseID,ProductName,SpecDesc,Purpose,Quantity,UnitPrice,Amount,IntendingDeliveryDate)
  VALUES(@PurchaseItemID,@PurchaseID,@ProductName,@SpecDesc,@Purpose,@Quantity,@UnitPrice,@Amount,substring(@IntendingDeliveryDate,1,10))
  --INSERT PurchaseItems
  FETCH NEXT FROM cur INTO
  @ProductName,@SpecDesc,@Purpose,@Quantity,@UnitPrice,@Amount,@IntendingDeliveryDate
 END
 CLOSE cur
 DEALLOCATE cur
 COMMIT TRAN
 END TRY
 BEGIN CATCH
  ROLLBACK TRAN
 END CATCH 
END

posted @ 2009-09-07 11:04  上海啸傲  阅读(107)  评论(0编辑  收藏  举报