SQL中的循环突然停止(内存不足)

时间:2012-08-22 15:18:40

标签: sql sql-server tsql while-loop

由于很多人问我想要实现什么 - 这是一个解释。

我必须向Benfits运营商提供文件馈送。文件的格式是 会员1记录, 福利1记录, 福利2记录等..  会员2记录, Benefits1, 好处2等等。

我这样做的方法是让所有成员回复并将其放入@member table。然后我获得了所有成员的所有好处并加入了@Medical_nonHMO table

然后我循环,获取第一个@member记录(只有一条记录)和相应的@Medical_nonHMO记录(可能超过1 )。然后,我从@member获取第二个成员记录,并从@Medical_nonHMO获取相应的福利记录,依此类推。

是的,我检查了@count的值。

    Select Max(idx) and select count(*) are returning the same value

我不确定如何使用游标来实现这一目标。

我有大约300个会员记录和大约400多个福利记录。 它适用于大约200条记录然后突然结束,有时会给出“内存输出”错误。

我有以下循环。

@member,@medical_nonHMO是临时的。填充了值的表。

@tempcounttable有304行,即@count

的值

我正在为每个成员和成员的利益进行循环

我面临的问题是,即使在执行查询之后,它仍然只循环了174次。

“Out of Loop”不会被打印出来。

但偶尔会发生这种情况。有时循环完全执行并打印'Out of Loop'

DECLARE @tempCounttable TABLE
(
idx smallint Primary Key IDENTITY(1,1),
SSN varchar(9),
SSN_dep varchar(9),
fname varchar(25)
)


INSERT into @tempCounttable 
select SubscriberSSN,   -- Employee SSN
   MemberSSN,   -- Dependent SSN
   FirstName
 from @member

select @count =  MAX(idx) from @tempCounttable
Set @i = 1
While(@i <= @count) 
Begin

  select * from @member
 where SubscriberSSN = (select SSN from @tempCounttable where idx = @i)
and MemberSSN = (select SSN_dep  from @tempCounttable  where idx = @i)
    and FirstName = (select fname from @tempCounttable  where idx = @i)

   select * from @Medical_nonHMO
   where SSN = (select SSN from @tempCounttable where idx = @i)
    and SSN_dependent = (select SSN_dep from @tempCounttable where idx = @i)
     and fname = (select fname from @tempCounttable where idx = @i)

Set @i = @i + 1
select @i           
end

 select 'OUT OF LOOP'

2 个答案:

答案 0 :(得分:1)

我假设@count正在返回174行而不是304,正如您所期望的那样,因此需要174次迭代。该表是否在其他地方被修改?此外,尝试在每次运行查询之前打印@count以提供指示符。

作为旁注,我个人不明白为什么这是一个while循环?您可以加入@member@tempCounttable,因为您只是选择数据:

SELECT * FROM @member m
 INNER JOIN @tempCounttable t ON m.memberSSN = t.SSN_dep:

您还可以过滤fname和SSN。

答案 1 :(得分:0)

请使用以下

验证您的断言@count是否正确
select @count =  MAX(idx) from @tempCounttable
Set @i = 1
While(@i <= @count) 
Begin
  select SSN from @tempCounttable where idx = @i
  Set @i = @i + 1
  select @i           
end
select 'OUT OF LOOP'