2010-08-26 8 views
5

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

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

ответ

13

, потому что это 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 @[email protected]@rowcount 
    end 
    else 
    execute StoredProcedure @i 
    set @[email protected]+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 

PRINT также портит его, это будет 2

select 1 
union all 
select 2 

select @@rowcount --2 
go 

это будет 0

select 1 
union all 
select 2 

print '1' 
select @@rowcount -- 0 

Я создал пост с большим количеством примеров и объяснений здесь: When should you store @@ROWCOUNT into a variable?

+0

что-нибудь после результата привести к его сбросу, я также добавил пример с печатью, ошибка @@ имеет такое же поведение – SQLMenace

+0

Требуется ли поведение, которое: if @ i = 0 влияет на @@ rowcount значение? Вы видите, что мне нужен номер строки первого набора результатов. Как я могу это достичь? – phoenies

+0

см. Измененный код, если вашему нужно больше 1 инструкции, затем добавьте BEGIN END вокруг него – SQLMenace

0

Я предполагаю, что ответ SQLMenace правильный, b ut add, «Не сделал бы это, как вы хотите?»:

declare @RowNum int 
    execute StoredProcedure 0 
    set @[email protected]@rowcount 
    execute StoredProcedure 1 
    print @RowNum 
+0

Пример кода неточно. Что после 'execute' на самом деле является динамически созданной строкой, что очень сложно. Я действительно не хочу повторять генерирующую часть кода. – phoenies

0

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

+0

Вы правы. Код примера является неточным. На самом деле это скорее строка, чем СП. – phoenies

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