计算SQL Server存储过程中删除的行数
在SQL Server 2005中,是否有删除行的方法,并被告知有多less人被删除?
我可以用相同的条件做一个select count(*)
,但是我需要这个值得信赖。
我的第一个猜测是使用@@ROWCOUNT
variables – 但没有设置,例如
delete from mytable where datefield = '5-Oct-2008' select @@ROWCOUNT
总是返回一个0。
MSDNbuild议OUTPUT
结构,例如
delete from mytable where datefield = '5-Oct-2008' output datefield into #doomed select count(*) from #doomed
这实际上是一个语法错误失败。
有任何想法吗?
你有没有尝试SET NOCOUNT OFF
?
在SQL2000中,我使用@@ ROWCOUNT来实现这个目的,没有任何问题。 确保在检查它之前不要无意中重置此计数(BOL:'此variables被任何不返回行的语句设置为0,如IF语句')。
只要这样做:
SET NOCOUNT off ; SELECT @p1 = @@ROWCOUNT
其中p1是您在存储过程中设置的输出参数。 希望能帮助到你。
在你的示例中, @@ROWCOUNT
应该可以工作 – 这是查找大量删除行的正确方法。 如果你想从应用程序中删除某些东西,那么你需要使用SET NOCOUNT ON
根据MSDN @@ ROWCOUNT函数即使在SET NOCOUNT为ON时也会更新,因为SET NOCOUNT
只会影响执行后得到的消息。
因此,如果您尝试使用ADO.NET中的@@ROWCOUNT
结果,那么SET NOCOUNT ON
应该肯定有帮助。
我发现了一个你不能使用@@rowcount
,比如当你想知道被删除的值的不同数量而不是总数时。 在这种情况下,您将不得不执行以下操作:
delete from mytable where datefield = '5-Oct-2008' output deleted.datefield into #doomed select count(distinct datefield) from #doomed
OP中的语法错误是因为output
不包括在datefield
字段名称之前deleted
。
用一列id创build临时表。
插入临时表中select您要删除的ID。 这给了你数。
从你的表中删除id(从temp表中selectid)
出于好奇,你怎么叫这个程序? (我假设这是一个存储过程?)。 我要问的原因是存储过程的返回值(在这种情况下为0)和行集结果之间存在差异,在这种情况下,行结果将是具有单列的单行。 在ADO.Net中,前者将通过参数访问,后者通过SqlDataReader访问。 你是否可能把程序的返回值误认为是行数?