2016-12-09 2 views
0

Как можно использовать объявленный параметр, с пунктом и курсор в одном запросеSQL в сочетании с п и Cursor

declare @TOP10 table (Cat Nvarchar(max),SubGUID uniqueidentifier) 
declare @Sub uniqueidentifier 
declare GUID_Cursor cursor FOR 
(select SubGUID from dbo.Sub with(nolock) where year=2016) 
; 
with [MyTable] as 
(
Select SubGUID, color from dbo.Cars with(nolock) where color ='blue' 
) 


open GUID_Cursor 
fetch next from GUID_Cursor into @Sub 
while @@FETCH_STATUS=0 
begin 
insert into @TOP10 (Cat,SubGUID) 

select color,SubGUID from [MyTable] 
where [email protected] 

fetch next from GUID_Cursor into @Sub 

end 
close GUID_Cursor 
deallocate GUID_Cursor 

select * from @TOP10 

Я просто не могу найти способ ту открыть курсор после использования статьи С.

Может ли кто-нибудь мне помочь?

+0

CTE - это всего лишь дополнительный запрос. Перепишите его как таковое, и это должно помочь. – dfundako

+0

не должно быть предложением 'with' после' declare cursor for'? – McNets

ответ

4

Ну, кроме логики вашего кода (для меня - здесь нет необходимости в курсоре), вы должны просто переместить объявление CTE ближе к месту, где вы его используете.

;with [MyTable] as 
(
    Select SubGUID, color from dbo.Cars with(nolock) where color ='blue' 
) 
insert into @TOP10 (Cat,SubGUID)  
select color,SubGUID from [MyTable] 
where [email protected] 

Но на самом деле, весь ваш код может быть заменен:

declare @TOP10 table (Cat Nvarchar(max),SubGUID uniqueidentifier) 

insert into @TOP10 (Cat,SubGUID) 
select color,SubGUID 
from dbo.Cars with(nolock) 
where 
    color ='blue' 
    and SubGUID in (select SubGUID from dbo.Sub with(nolock) where year=2016) 

select * from @TOP10 
0

Я согласен с @AndyKorneyev, но ради эксперимента:

declare @crTest CURSOR, 
     @name VARCHAR(1000), 
     @type VARCHAR(1000) 

set @crTest = CURSOR FAST_FORWARD FOR 
    WITH cteObjs AS (
     SELECT TOP 10 NAME, type 
     FROM sys.objects o 
     ) 
    select name, type 
    from cteObjs 


OPEN @crTest 

FETCH NEXT FROM @crTest 
INTO @name, @type 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @name 
    PRINT @type 

    FETCH NEXT FROM @crTest 
    INTO @name, @type 
END 

CLOSE @crTest 
DEALLOCATE @crTest 
0

Не хотите повторите выше фрагменты, но имейте в виду, что набор результатов предложения WITH должен обрабатываться непосредственно на его конце.

В отличии от вашего @tableVar, объем результирующего набора, возвращаемый КТР не действует в полной партии и, следовательно, должны быть следует SELECT, INSERT, UPDATE или DELETE заявления. (подробности и примеры см .: https://msdn.microsoft.com/en-us/library/ms175972.aspx или следуйте одному из других ответов).

e. г.


    --> declare var: 
    declare @tableVar table (colOne int, colTwo nvarchar(30) 
    ); 

    --> use cte: 
    with preOne as(select carId, color from pcUser with (nolock) 
    ) 
    --> directly followed by insert: 
    insert into @tableVar(userId, logInName) 
     select colOne, colTwo from @tableVar; 

    --> use var in cursor or anywhere else in the batch 

Хотя я не совсем уверен, что вы нацелены на, возможно, короткий присоединиться может сделать трюк здесь:

select a.[SubGUID] 
from [dbo].[Sub] as a with (nolock) 
    inner join [dbo].[Cars] as b with (nolock) on a.[SubGUID] = b.[SubGUID] 
where a.[year] = 2016 and b.[color] = 'blue'; 
0

В конце концов я использовал временные tabeles как # TOP10. Что я выбрал после запроса. Как только я избавился от части with [MyTable] as, у меня не было больше проблем с параметрами.

Спасибо всем.

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