SQL遍历 游标问题*
我开始写了两个存储过程,一个是根据订单号(OrderID)得到路程(Tpm)只有一条。
另外一个是根据用户UID得到订单号 但是为多行,返回的OrderID可能是个集合。
问题来了,我想根据一个UID 得到所有的路程。
也就是在存储过程2中得到的可能有的多个订单号,然后遍历这些订单号,放到第一个存储过程
中拿到路程然后累加。
这个SQL语句应该如何写? 存储过程中可以调用存储过程吗?
如果大家觉得可以吧两个存储过程写一起的话更好。
SQL语句遍历只能用游标吗?查看了资料,游标貌似看不太懂。呵呵。
请大侠帮忙。。。
附(两个存储过程名称写错了,名称不是一样的,见谅)
SQL 遍历 存储
[解决办法]
这个不建议用循环,直接在存储过程2里面使用存储过程1里面的方式得到所有路程就好了
在2里面你已经得到所有的订单号了,那么你一个订单可以得到路程,使用的条件是订单号=,那么多个订单号
就可以使用订单号in()这样的条件。
[解决办法]
CREATE PROCEDURE [dbo].[proc_GetFltAriLineByOrderId2]
@UID varchar(10) AS
begin
declare @OrderID bigint
declare @tpmList(OrderID bigint,Tpm varchar(100))
declare cur cursor for
select distinct OrderID from [FltOrderDB].dbo.[FltPassenger] fp join [UserDB].dbo.[Member_Corp] corp
on fp.CorpUID=corp.UID
open cur
fetch next from cur into @OrderID
while @@fetch_status=0
begin
insert into @tpmList(Tpm) exec [你得到Tpm的SP,参数是@OrderID,注意返回的结果只能是一行Tpm]
update @tpmList set OrderID=@OrderID where OrderID is null
fetch next from cur into @OrderID
end
close cur
deallocate cur
select * from
[FltOrderDB].[dbo].[FltPassenger] fltpass
inner join [FltOrderDB].[dbo].[FltOrder] fltorder on fltpass.OrderID=fltorder.ID
inner JOin [UserDB].[dbo].[Member_Corp] corp on fltpass.CorpUID=corp.UID
Inner join @tpmList tpm on tpm.OrderID=fltpass.OrderID
where corp.UID=@UID and fltorder.Status=1
end
[解决办法]
回答楼主几个问题
1、存储过程可以调存储过程
2、但是调用了不能像楼主想的那样,返回个结果然后你再操作,你可以在存储过程1中把结果放到临时表中,然后在存储过程2中查临时表,在存储过程2中释放临时表
3、游标不会用,就用while循环。其实你说的情况完全可以在存储过程2中用表关联一把得出结果
[解决办法]
参考你另外一帖,我写的SQL。
这儿我要多说一句,游标不像传说中的效率那么差,连用都不能用。定义成本地,静态,只向前类型的游标,在数据量不太大的情况,完全可以放心使用。
[解决办法]
try this,
create proc dbo.[存储过程名]
(@UID varchar(10))
as
begin
set nocount on
create table #Orders(OrderID varchar(10))
create table #return(Tpm varchar(6000))
insert into #Orders(OrderID) exec dbo.proc_GetFltAriLineByOrderId2 @UID
declare @oid varchar(10)
declare ap scroll cursor for select OrderID from #Orders
open ap
fetch first from ap into @oid
while(@@fetch_status<>-1)
begin
insert into #return(Tpm)
exec dbo.proc_GetFltAriLineByOrderId @oid
fetch next from ap into @oid
end
close ap
deallocate ap
select @UID 'UID',Tpm from #return
end