日期:2014-05-17  浏览次数:20785 次

这样一个存储过程中的循环,怎么获取不完全。
ALTER PROCEDURE [dbo].[proc_AdvReportMutSelect] 
  @VacationDate datetime,
  @dateDiff int
AS

declare @i int
set @i=0
WHILE (@i<@dateDiff)
BEGIN

select 
b.CIFNm,b.CustomNm,dd.phone,(SUM(isnull(a.RepayAmount-a.receivableAmount,0))) Repaymoney,
kk.PRepayDate,
b.LoanNm,b.LoanStratDate,b.LoanAmount



from 

(
select * from InterestReceive 
union all select * from InterestReceivetemp
 ) a
left join 
(
select  max(convert(varchar(10),PeriodRepyDate,120)) PRepayDate,ContractNm repd from 
(
select * from InterestReceive 
union all select * from InterestReceivetemp) aa
group by ContractNm
)
 kk
on kk.repd=a.ContractNm 

left join OPSInf b on a.ContractNm=b.LoanNm  
left join (
select CIFNm,phone from 
(
select CIFNm,case LoanType when '个人客户' then
case 
when SUBSTRING(PerMobliePhB,0,PATINDEX('%|%',PerMobliePhB))='' then PerMobliePhB
else SUBSTRING(PerMobliePhB,0,PATINDEX('%|%',PerMobliePhB))
end 
when '企业客户' then CompanyContactMphontA else '' end phone,SalesDate 
from LoanInf where Followstate='已审核' 
) c  

left join 
(select MAX(salesdate) salsd ,CIFNm cfin from LoanInf where 
 Followstate='已审核' group by CIFNm) b 
 
 on 
 b.cfin=c.CIFNm 
  where salsd = c.SalesDate
 
  ) dd 
 
 on dd.CIFNm=a.CIFNm 
 
where convert(varchar(10),a.PeriodRepyDate,120)=convert(varchar(10),dateadd(day,@i,@VacationDate),120)
and isnull(a.RepayAmount-a.receivableAmount,0)>0
group by 
b.CIFNm,b.CustomNm, dd.phone,kk.PRepayDate,b.LoanNm,b.LoanStratDate,b.LoanAmount  
SET @i=@i+1
 END

这个存储过程是正确的,但是当我按照红色部分写也是正确的,唯一有问题的地方就是程序读的时候,只能读取到第一条循环记录的值,后面的就读不出来了,奇怪,有人知道么》
比如:
当赋值:  @VacationDate ‘2013-12-20’,
  @dateDiff 7
这个时候,运行代码,就只能读到1天的数据,但是在SQLSERVER编辑器里测试,就可以读到七天,这个是MSSQLbug么》
------解决方案--------------------
帮你改了一下,你再试试:

ALTER PROCEDURE [dbo].[proc_AdvReportMutSelect] 
  @VacationDate datetime,
  @dateDiff int
AS

declare @i int
set @i=0
WHILE (@i<@dateDiff)
BEGIN

select 
b.CIFNm,b.CustomNm,dd.phone,(SUM(isnull(a.RepayAmount-a.receivableAmount,0))) Repaymoney,
kk.PRepayDate,
b.LoanNm,b.LoanStratDate,b.LoanAmount



from 

(
select * from InterestReceive 
union all select * from InterestReceivetemp
 ) a
left join 
(
select  max(convert(varchar(10),PeriodRepyDate,120)) PRepayDate,ContractNm repd from 
(
select * from InterestReceive 
union all select * from I