2013-04-04 2 views
0

У меня есть sql хранимый proc, где я использую курсор, который содержит набор идентификаторов из оператора select, и я использую эти 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

Этот код запускает выбор для каждой итерации курсора, что делает его похожим на «множество таблиц». Похоже, вам нужно вставить результаты этого выбора в временную таблицу или переменную таблицы внутри курсора, а затем, как только курсор будет завершен, выберите один раз из этой временной таблицы. Я не подробно рассмотрел ваш код, но я предполагаю, что для этого не требуется курсор.

Вот примерный пример с использованием переменной таблицы.

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

+0

Еще один вопрос о связанной заметке, запрос возвращает нулевые строки, а также, как избежать получения нулевых строк в выводе, является единственным способом добавить NOT NOT для каждого условия - Спасибо – Lav

+0

Не против вышеупомянутого вопроса, после использования подхода temp table никакие нулевые строки не возвращались. – Lav

Смежные вопросы