2012-08-22 21 views
0

由於許多人問我想要達到什麼 - 這是一個解釋。在SQL中循環突然停止(跳出memeory)

我必須向Benfits運營商提供文件提要。文件格式爲 Member1 Record, Benefits1記錄, Benefits2記錄等。 Member2記錄, Benefits1, Benefits2等等。

我這樣做的方式是獲得所有成員的reords,並把它放在@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'未打印。

但是這只是偶爾發生。有時循環完全執行,並打印「退出循環」

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' 
+1

你從正在拍攝*在手術過程中發生的任何*錯誤消息的環境中運行,這是否正確?涉及的表是否被其他程序同時主動修改,可能導致某種競爭條件? – mellamokb

+0

我實際上正在爲福利承運人撰寫一份檔案。現在,我只是在生產環境中進行測試 - 但是沒有其他方法正在運行。事實上,在此之前我有另一個類似的循環,它的工作原理很完美 – stackuser

+1

不應該要求從@ tempCounttable而不是'MAX'選擇@count = COUNT(idx)嗎? – Kermit

回答

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。

+0

@count是304.我有arelady檢查出來。此外,'Out of loop'沒有被打印。我需要循環的原因是因爲文件Feed需要此格式.MeMeber Record1,Benefit1,Benefit2,Member Record2,Benefit1,Bendift2等 – stackuser

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' 
+0

謝謝。這真的有幫助。 @count沒有得到正確的值。 – stackuser

+0

對不起!它曾經工作過一次。但現在再次,我有同樣的問題 – stackuser

+0

你的問題是@i是不是真正的數據。假定idx將具有從1到MAX(idx)的每個值都是簡單的草率。人們正在試圖幫助你,你只是不聽。解決方案首先拋出當前的代碼。 – Paparazzi