51

在 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

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

有任何想法吗?

4

7 回答 7

57

你试过SET NOCOUNT OFF吗?

于 2008-10-06T13:00:46.283 回答
11

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

于 2008-10-06T13:10:44.610 回答
8

只需这样做:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

其中 p1 是您在存储过程中设置的输出参数。希望能帮助到你。

于 2014-01-11T10:07:15.323 回答
6

在您的示例中@@ROWCOUNT应该可以工作 - 这是找出许多已删除行的正确方法。如果您尝试从应用程序中删除某些内容,那么您需要使用SET NOCOUNT ON

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

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

于 2008-10-06T13:03:56.480 回答
1

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

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

select count(distinct datefield)
from #doomed

OP 中的语法错误是因为在字段名称之前output没有包含。deleteddatefield

于 2015-03-11T19:16:23.953 回答
0

出于好奇,您如何调用该程序?(我假设它是一个存储过程?)。我问的原因是存储过程的返回值(在本例中为 0)和行集结果之间存在差异——在本例中为单行和单列。在 ADO.Net 中,前者将通过参数访问,而后者通过 SqlDataReader 访问。您是否可能将过程的返回值误认为是行数?

于 2008-10-08T15:18:59.717 回答
-1

创建具有一列 id 的临时表。

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

从 id 所在的表中删除(从临时表中选择 id)

于 2008-10-06T13:00:46.253 回答