计算SQL Server存储过程中删除的行数

在SQL Server 2005中,是否有删除行的方法,并被告知有多less人被删除?

我可以用相同的条件做一个select count(*) ,但是我需要这个值得信赖。

我的第一个猜测是使用@@ROWCOUNTvariables – 但没有设置,例如

 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访问。 你是否可能把程序的返回值误认为是行数?