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

时间:2008-10-06 12:56:23

标签: sql-server tsql audit sql-delete

在SQL Server 2005中,是否有一种方法可以删除行并告知有多少实际已删除?

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

我的第一个猜测是使用@@ROWCOUNT变量 - 但未设置,例如

delete 
from mytable 
where datefield = '5-Oct-2008' 

select @@ROWCOUNT 

始终返回0.

MSDN建议OUTPUT构造,例如

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed

select count(*) 
from #doomed

这实际上因语法错误而失败。

有什么想法吗?

7 个答案:

答案 0 :(得分:51)

您是否尝试过SET NOCOUNT OFF

答案 1 :(得分:10)

我在SQL2000中使用@@ ROWCOUNT这个确切的目的没有任何问题。确保在检查之前不会无意中重置此计数(BOL:'此变量由任何不返回行的语句设置为0,例如IF语句')。

答案 2 :(得分:7)

这样做:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

其中p1是您在存储过程中设置的输出参数。 希望它有所帮助。

答案 3 :(得分:5)

在您的示例中@@ROWCOUNT应该有效 - 这是找到一些已删除行的正确方法。如果您尝试从应用程序中删除某些内容,则需要使用SET NOCOUNT ON

根据MSDN @@ ROWCOUNT函数即使在SET NOCOUNT为ON时也会更新,因为SET NOCOUNT仅影响执行后得到的消息。

因此,如果您尝试使用来自(例如)ADO.NET的@@ROWCOUNT的结果,那么SET NOCOUNT ON肯定会有所帮助。

答案 4 :(得分:1)

我发现了一个不能使用@@rowcount的情况,就像您想知道已删除的值的不同计数而不是总计数一样。在这种情况下,您必须执行以下操作:

delete from mytable 
where datefield = '5-Oct-2008' 
output deleted.datefield into #doomed

select count(distinct datefield)
from #doomed

OP中的语法错误是因为outputdeleted字段名称之前未包含datefield

答案 5 :(得分:0)

出于好奇,你怎么称呼这个程序? (我假设它是一个存储过程?)。我问的原因是存储过程的返回值(在这种情况下为0)与行集结果之间存在差异 - 在这种情况下,行集结果将是具有单个列的单行。在ADO.Net中,前者可以通过参数访问,后者可以通过SqlDataReader访问。您是否可能将程序的返回值误认为是rowcount?

答案 6 :(得分:-1)

使用一列id创建临时表。

插入临时表,选择要删除的ID。这给了你数数。

从你的表中删除id in(从临时表中选择id)