为什么我无法获得@@ rowcount值?
下面是我有的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
因为这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?
我会假设SQLMenace的答案是正确的,b “这不是你想要的吗?”:
declare @RowNum int
execute StoredProcedure 0
set @[email protected]@rowcount
execute StoredProcedure 1
print @RowNum
示例代码不准确。 'execute'后面的内容实际上是一个动态生成的字符串,非常复杂。我真的不想重复代码的生成部分。 – phoenies 2010-08-26 14:17:58
我会避免这种风格的一般。如果您在调用过程之后通过查询@@ rowcount检索SP中的一个表中选择的行数,实际上会引入一个不必要的依赖关系,以说明过程如何在内部实现并且影响显式性。如果您稍后更改该过程的实施,则可能会破坏外部代码,并且在修改SP时不会很明显。您应该使用适当命名的输出参数。
你说得对。示例代码不准确。事实上,这是一个字符串而不是SP。 – phoenies 2010-09-02 06:39:47
任何事后结果导致它被重置,我还加了一个打印的例子,@@错误具有相同的行为 – SQLMenace 2010-08-26 14:10:26
是否需要的行为?如果@ i = 0?影响@@ rowcount值?你看我需要第一个结果集的行号。我怎样才能做到这一点? – phoenies 2010-08-26 14:12:22
看到修改后的代码,如果你还需要超过1条语句,那么在它周围加上BEGIN END – SQLMenace 2010-08-26 14:16:51