7

下面是我拥有的 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
4

3 回答 3

14

因为这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

PRINT 也搞砸了,这将是 2

select 1
union all
select 2

select @@rowcount --2
go

这将是 0

select 1
union all
select 2

print '1'
select @@rowcount -- 0

我在这里创建了一个包含更多示例和解释的帖子:何时应将 @@ROWCOUNT 存储到变量中?

于 2010-08-26T14:04:23.453 回答
0

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

    declare @RowNum int 
    execute StoredProcedure 0
    set @RowNum=@@rowcount 
    execute StoredProcedure 1 
    print @RowNum 
于 2010-08-26T14:08:22.263 回答
0

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

于 2010-08-27T05:58:44.990 回答