存储过程在数据操作中的重要作用

问:“怎样相应情况下插入N条数据,却不在程序里控制?”

答:“由于SQL Sever不支持数组参数.所以只能用另类地办法了.利用SQL Server强大地字符串处理传把数组格式化为类似"1,2,3,4,5,6"。

然后在存储过程中用SubString配合CharIndex把分割开来。

详细地存储过程:

CREATE PROCEDURE dbo.ProductListUpdateSpecialList
  @ProductId_Array varChar(800),
  @ModuleId int
  AS
  DECLARE @PointerPrev int
  DECLARE @PointerCurr int
  DECLARE @TId int
  Set @PointerPrev=1
  set @PointerCurr=1
  
  begin transaction
  Set NoCount ON
  delete from ProductListSpecial where ModuleId=@ModuleId
  
  Set @PointerCurr=CharIndex
    ',',@ProductId_Array,@PointerPrev+1)
  set @TId=cast(SUBSTRING(@ProductId_Array,@PointerPrev,
    @PointerCurr-@PointerPrev) as int)
  Insert into ProductListSpecial
    (ModuleId,ProductId) Values(@ModuleId,@TId)
  SET @PointerPrev = @PointerCurr
  while (@PointerPrev+1 < LEN(@ProductId_Array))
  Begin
  Set @PointerCurr=CharIndex
    (',',@ProductId_Array,@PointerPrev+1)
  if(@PointerCurr>0)
  Begin
  set @TId=cast(SUBSTRING
    (@ProductId_Array,@PointerPrev+1,
    @PointerCurr-@PointerPrev-1) as int)
  Insert into ProductListSpecial
    (ModuleId,ProductId) Values(@ModuleId,@TId)
  SET @PointerPrev = @PointerCurr
  End
  else
  Break
  End
  
  set @TId=cast(SUBSTRING
   (@ProductId_Array,@PointerPrev+1,
   LEN(@ProductId_Array)-@PointerPrev) as int)
  Insert into ProductListSpecial
   (ModuleId,ProductId) Values(@ModuleId,@TId)
  Set NoCount OFF
  if @@error=0
  begin
  commit transaction
  end
  else
  begin
  rollback transaction
  end
  GO

技术革新方法:

应该用Sql2000 OpenXML更简单,效率更高,代码更可读:

CREATE Procedure [dbo].[ProductListUpdateSpecialList]
  (
  @ProductId_Array NVARCHAR(2000),
  @ModuleId INT
  )
  
  AS
  
  delete from ProductListSpecial where ModuleId=@ModuleId
  
  -- If empty, return
  IF (@ProductId_Array IS NULL OR LEN(LTRIM
   (RTRIM(@ProductId_Array))) = 0)
  RETURN
  
  DECLARE @idoc int
  
  EXEC sp_xml_preparedocument @idoc OUTPUT, @ProductId_Array
  
  Insert into ProductListSpecial (ModuleId,ProductId)
  Select
  @ModuleId,C.[ProductId]
  FROM
  OPENXML(@idoc, '/Products/Product', 3)
  with (ProductId int ) as C
  where
  C.[ProductId] is not null
  
  EXEC sp_xml_removedocument @idoc

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值