好东西:让存储过程的参数也能传入数组的方法
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
看起来很多....其实挺实用的...不过传进去的那个数组组成的字符串多了的话执行效率不会高..
这个存储过程我也是网上搜出来的.然后自己根据项目修改得来..看到这个之前我可写不出来.呵呵.
虽然存储过程不是原创但分享精神可佳,希望大家支持....共同进步..
所以都会发到博客园来分享一下...希望觉得不错的兄弟支持一下..
这次记的是一个给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
看起来很多....其实挺实用的...不过传进去的那个数组组成的字符串多了的话执行效率不会高..
这个存储过程我也是网上搜出来的.然后自己根据项目修改得来..看到这个之前我可写不出来.呵呵.
虽然存储过程不是原创但分享精神可佳,希望大家支持....共同进步..
相关文章推荐
- j2ee调用Oracle带数组参数和游标的存储过程方法
- java调用oracle存储过程传入参数为数组的处理
- java 调用oracle存储过程传入 数组参数 不用纯jdbc连接
- clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】
- Oracle存储过程传入类似java中list、数组类型的参数并使用
- sql调用存储过程传入数组方法
- oracle 向存储过程传入数组类型参数
- c#定义一个方法,根据存储过程名称和存储过程参数数组,执行对应的存储过程
- 向存储过程中传入列表参数
- 深入mysql存储过程中表名使用参数传入的详解
- 执行带参数的存储过程的方法II(相对通用)
- mysql存储过程传入两个参数,循环插入数据
- 包含表值类型参数的存储过程调试方法
- SQLServer-存储过程中使用字符串和分隔符实现传递数组参数(转)
- 在MySQL中创建带有IN和OUT参数的存储过程的方法
- 存储过程参数的时间默认值解决方法
- Delphi 方法或过程中用的参数是动态数组的用法。
- JAVA调用Oracle存储过程传入结构化参数
- 如何 控制传入的参数减少存储过程的代码量
- C#调用Oracle的存储过程,其参数为数组类型