2013-04-04 66 views
0

我有一個sql存儲過程,其中我使用的遊標包含一組來自select語句的id的遊標,我使用這些id逐個使用遊標將值轉換爲其他變量並使用這些變量做sql連接。我的問題是,當我執行這個我得到很多表返回,而我只需要一個表返回。SQL遊標返回許多表

SET NOCOUNT ON 


declare @BSVal as int 
declare @GSVal as int 

declare @mID as int 
declare @qID as int 

DECLARE M_Cursor cursor for 

select 
ms.MID,ms.QID 
from vM As ms join QS as qs 
ON ms.QSID=qs.QIDjoin 
Mar as mar on mar.MarID=qs.MarID 
where (ms.Cid='Web') 

open M_Cursor 

FETCH NEXT FROM M_Cursor 
INTO @mID, @qID 


--Get values 
WHILE @@FETCH_STATUS = 0 
BEGIN 
set @BSVal= (select top 1 SCID from vSC where (EnID in 
(select EnID from En where EnName='BAIDU') 
and QTID=1 and [email protected] [email protected])order by ITime desc); 
set @GSVal= (select top 1 SCID from vSC where (EnID in 
(select EnID from En where EnName='GRAPHIC') and QTID=1 
and [email protected] [email protected]) order by ITime desc); 




select * from 

vM m 

join vw5TABLE BNDCG on (m.QSid=BNDCG.QID And BNDCG.Position=1) 
join vw5TABLE GNDCG on (m.QSid=GNDCG.QID And GNDCG.Position=1) 

where 

[email protected] 
and [email protected] 
and [email protected] qID 
and [email protected] qID 
and [email protected] 




FETCH NEXT FROM M_Cursor 
    INTO @MID, @QSID 


END 
CLOSE M_Cursor; 
DEALLOCATE M_Cursor; 

回答

1

該代碼將爲遊標的每次迭代運行一次select,這使得它看起來像「多個表」。這聽起來像需要將該選擇的結果插入到遊標內的臨時表或表變量中,然後一旦遊標完成,從該臨時表中選擇一次。我沒有仔細檢查你的代碼,但我猜測這可能不需要光標。

下面是使用表變量的粗略示例。

DECLARE @temptable TABLE (col1 INT, Col2 VARCHAR(3), Col3 INT) 


insert into @temptable (col1,col2,col3) 
select (col1,col2,col3) from 
vM m 
join vw5TABLE BNDCG on (m.QSid=BNDCG.QID And BNDCG.Position=1) 
join vw5TABLE GNDCG on (m.QSid=GNDCG.QID And GNDCG.Position=1) 
where 
[email protected] 
and [email protected] 
and [email protected] qID 
and [email protected] qID 
and [email protected] 

.... 
.. 

DEALLOCATE M_Cursor; 

SELECT Col1,Col2,Col3 FROM @temptable 
+0

謝謝!聽起來是正確的,我會按照你的建議實施臨時表。 – Lav 2013-04-05 15:30:53

+0

在相關說明上還有一個問題,查詢返回空行以及如何避免在輸出中獲取空行,是唯一的方法爲每個條件添加IS NOT NULL - 謝謝 – Lav 2013-04-05 15:50:54

+0

不介意上述問題,在使用臨時表方法後,不返回空行。 – Lav 2013-04-05 16:28:31