好东西:让存储过程的参数也能传入数组的方法

每次写的随笔都是我在项目中用到的一些个人觉得比较值得记下的东西,

所以都会发到博客园来分享一下...希望觉得不错的兄弟支持一下..

这次记的是一个给sql的存储过程传数组参数的问题..大家都知道sql是不支持数组的,所以需要用特殊方法来处理..

在大多数项目中,都会有全选/删除这样的操作..一般的解决办法是在后台代码里循环执行sql语句..

昨天在我的项目中,遇到一个棘手的问题,就是传入任意的编号查询该编号下的信息..同时可以查10个以内的编号..这里不细说,难得描述...直接看语句吧...

这是一个将循环select出来的结果插入一张临时表合并起来...就是我要的结果了..里面注释得很清楚了.

 

ContractedBlock.gifExpandedBlockStart.gifCode
--执行存储过程

exec SelectAllByKemuCode '1001,1009','2009','2'

--存储过程内容
create PROCEDURE  sp_SelectAllByKemuCode
    
@kemucode_Array  varChar(max),   --这个是传进来的数组(格式是"123,456,789";大家可以根据自己的情况自己换分割符)
    
@pz_year varchar(4),  --这个是项目中需要的一个参数
 
@pz_month varchar(4)  --同上
 
AS
    
DECLARE  @PointerPrev int   --上一个位置
     
DECLARE @PointerCurr  int  --当前位置
    
DECLARE  @kemu_code varchar(50)   --这个就是分割得来的编号信息.自己更改使用.
    
declare @temp_table table(total_money decimal(18,2))   --临时表(一般insert,delete,update语句都不需要这个.我这里是特殊情况,需要保存所有select的信息.)
     
Set @PointerPrev=1 
    
set  @PointerCurr=1
     
    
begin transaction 
    
Set NoCount  ON
    
     
Set @PointerCurr=CharIndex (',',@kemucode_Array ,@PointerPrev+1)
     
set @kemu_code=cast (SUBSTRING(@kemucode_Array,@PointerPrev ,@PointerCurr-@PointerPrev)  as varchar(50))

--这里的sql语句大家就自己换了,,下面写的有点多..大家往简单里看..下面都一样了..

--例如:insert into db_yours_table values(xxx,xxx) 
insert into @temp_table(total_money) (select (sum(pz_borrow)+sum(pz_loan)) as total_money from View_kemu_account where kemu_code like @kemu_code+'%' and pz_isaccount = 0 and pz_year=@pz_year and pz_month=@pz_month group by pz_month)
    
    
SET @PointerPrev =  @PointerCurr
    
while  (@PointerPrev+1  < LEN(@kemucode_Array))
     
Begin
        
Set  @PointerCurr=CharIndex',',@kemucode_Array@PointerPrev+1)
         
if(@PointerCurr> 0)
        
Begin
             
set @kemu_code=cast (SUBSTRING(@kemucode_Array,@PointerPrev +1,@PointerCurr- @PointerPrev-1as  varchar(50))
insert into @temp_table(total_money) (select (sum(pz_borrow)+sum(pz_loan)) as total_money from View_kemu_account where kemu_code like @kemu_code+'%' and pz_isaccount = 0 and pz_year=@pz_year and pz_month=@pz_month group by pz_month)

SET @PointerPrev =  @PointerCurr

        
End 
        
else
             
Break
    
End 
    
     
set @kemu_code=castSUBSTRING(@kemucode_Array,@PointerPrev+ 1,LEN(@kemucode_Array )-@PointerPrevas  varchar(50))
insert into @temp_table(total_money) (select (sum(pz_borrow)+sum(pz_loan)) as total_money from View_kemu_account where kemu_code like @kemu_code+'%' and pz_isaccount = 0 and pz_year=@pz_year and pz_month=@pz_month group by pz_month)

SET @PointerPrev =  @PointerCurr

select * from @temp_table    
 
if @@error= 0
    
begin
         
commit transaction
     
end
    
else 
    
begin
         
rollback transaction
     
end
GO

 

看起来很多....其实挺实用的...不过传进去的那个数组组成的字符串多了的话执行效率不会高..

这个存储过程我也是网上搜出来的.然后自己根据项目修改得来..看到这个之前我可写不出来.呵呵.

虽然存储过程不是原创但分享精神可佳,希望大家支持....共同进步..

转载于:https://www.cnblogs.com/facklong/archive/2009/02/12/1388760.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值