Почему я не могу получить значение @@ rowcount? - PullRequest
6 голосов
/ 26 августа 2010

Ниже приведена упрощенная версия сценария SQL, которую я имею. print @RowNum всегда показывает 0, а не реальный номер записи первого набора результатов. В чем дело? Спасибо.

declare @i int, @RowNum int
set @i=0
while @i<2
begin
    execute StoredProcedure @i --containing a big select
    if @i=0 set @RowNum=@@rowcount
    set @i=@i+1
end
print @RowNum

Ответы [ 3 ]

13 голосов
/ 26 августа 2010

потому что это if @i=0

устанавливает его в 0, даже оператор печати установит его в 0

теперь запустите это

declare @i int, @RowNum int
set @i=0
while @i<2
begin
    if @i=0
    begin   
        execute StoredProcedure @i --containing a big select
        set @RowNum=@@rowcount
    end
    else
    execute StoredProcedure @i 
    set @i=@i+1
end
print @RowNum

вот еще один пример

select 1
union all
select 2

select @@rowcount --2
go

сейчас будет 0

select 1
union all
select 2
if 1=1
select @@rowcount --0

ПЕЧАТЬ также испортила, это будет 2

select 1
union all
select 2

select @@rowcount --2
go

это будет 0

select 1
union all
select 2

print '1'
select @@rowcount -- 0

Я создал пост с большим количеством примеров и объяснений здесь: Когда вы должны хранить @@ ROWCOUNT в переменной?

0 голосов
/ 27 августа 2010

Я бы вообще избегал этого стиля. Если вы извлекаете количество строк, выбранных из таблицы в SP, запрашивая @@ rowcount после вызова процедуры, вы фактически вводите ненужную зависимость от того, как процедура реализована внутри, и ставите под угрозу явность. Если вы позже измените реализацию процедуры, это может нарушить код снаружи, и это не будет очевидно при изменении SP. Вместо этого вы должны использовать выходной параметр, названный соответствующим образом.

0 голосов
/ 26 августа 2010

Я предполагаю, что ответ SQLMenace правильный, но добавлю: "Разве это не делает то, что вы хотите?":

    declare @RowNum int 
    execute StoredProcedure 0
    set @RowNum=@@rowcount 
    execute StoredProcedure 1 
    print @RowNum 
...