首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL遍历 游标有关问题

2013-08-24 
SQL遍历 游标问题* 我开始写了两个存储过程,一个是根据订单号(OrderID)得到路程(Tpm)只有一条。另外一个是

SQL遍历 游标问题*

 我开始写了两个存储过程,一个是根据订单号(OrderID)得到路程(Tpm)只有一条。
 SQL遍历 游标有关问题

 另外一个是根据用户UID得到订单号 但是为多行,返回的OrderID可能是个集合。
 SQL遍历 游标有关问题
 
 问题来了,我想根据一个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

热点排行