您的位置:首页 > 其它

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

2009-02-12 08:40 387 查看
每次写的随笔都是我在项目中用到的一些个人觉得比较值得记下的东西,

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

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

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

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

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

--执行存储过程

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-1) as 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=cast( SUBSTRING(@kemucode_Array,@PointerPrev+ 1,LEN(@kemucode_Array )-@PointerPrev) as 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

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

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

虽然存储过程不是原创但分享精神可佳,希望大家支持....共同进步..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: