2010-08-26 145 views

回答

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 2010-08-26 14:10:26

+0

是否需要的行为?如果@ i = 0?影响@@ rowcount值?你看我需要第一个结果集的行号。我怎样才能做到这一点? – phoenies 2010-08-26 14:12:22

+0

看到修改后的代码,如果你还需要超过1条语句,那么在它周围加上BEGIN END – SQLMenace 2010-08-26 14:16:51

0

我会假设SQLMenace的答案是正确的,b “这不是你想要的吗?”:

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

示例代码不准确。 'execute'后面的内容实际上是一个动态生成的字符串,非常复杂。我真的不想重复代码的生成部分。 – phoenies 2010-08-26 14:17:58

0

我会避免这种风格的一般。如果您在调用过程之后通过查询@@ rowcount检索SP中的一个表中选择的行数,实际上会引入一个不必要的依赖关系,以说明过程如何在内部实现并且影响显式性。如果您稍后更改该过程的实施,则可能会破坏外部代码,并且在修改SP时不会很明显。您应该使用适当命名的输出参数。

+0

你说得对。示例代码不准确。事实上,这是一个字符串而不是SP。 – phoenies 2010-09-02 06:39:47

相关问题