下面是我拥有的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
答案 0 :(得分:13)
因为if @i=0
将其设置为0,即使print语句也将其设置为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
我在这里创建了一篇包含更多示例和解释的帖子:When should you store @@ROWCOUNT into a variable?
答案 1 :(得分:0)
我会假设SQLMenace的答案是正确的,但补充说,“这不是你想做的吗?”:
declare @RowNum int
execute StoredProcedure 0
set @RowNum=@@rowcount
execute StoredProcedure 1
print @RowNum
答案 2 :(得分:0)
我会避免这种风格。如果通过在调用过程之后查询@@ rowcount来检索从SP中的表中选择的行数,则实际上是对内部实现过程的方式引入了不必要的依赖性并损害了显式性。如果您以后更改过程的实现,它可能会破坏外部代码,并且在修改SP时不会显而易见。您应该使用适当命名的输出参数。