0

selectステートメントからの一連のIDを含むカーソルを使用するSQLストアドプロシージャがあり、カーソルを使用してこれらのIDを1つずつ使用して値を他の変数に取得し、それらの変数を使用してSQL結合を行います.My問題は、これを実行すると多くのテーブルが返されるのに対し、返されるテーブルは 1 つだけです。

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 MID=@mIDand QSID=@qID)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 MID=@mIDand QSID=@QSID) 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

BNDCG.SCid=@BSVal
and GNDCG.SCid=@GSVal
and BNDCG.QSID=@ qID
and GNDCG.QSID=@ qID
and m.MID=@mID




FETCH NEXT FROM M_Cursor 
   INTO @MID, @QSID


END
CLOSE M_Cursor;
DEALLOCATE M_Cursor;
4

1 に答える 1

1

そのコードは、カーソルの反復ごとに選択を実行するため、「多くのテーブル」のように見えます。その選択の結果をカーソル内の一時テーブルまたはテーブル変数に挿入し、カーソルが完了したら、その一時テーブルから1回選択する必要があるようです。コードを詳しく調べていませんが、これにはカーソルは必要ないかもしれません。

これは、テーブル変数を使用した大まかなサンプルです。

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
BNDCG.SCid=@BSVal
and GNDCG.SCid=@GSVal
and BNDCG.QSID=@ qID
and GNDCG.QSID=@ qID
and m.MID=@mID

....
..

DEALLOCATE M_Cursor;

SELECT Col1,Col2,Col3 FROM @temptable
于 2013-04-04T23:51:29.663 に答える