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

问题描述 投票:0回答:8

在 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

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

有什么想法吗?

sql-server t-sql audit sql-delete
8个回答
59
投票
SET NOCOUNT OFF

    


12
投票


8
投票

SET NOCOUNT off ; SELECT @p1 = @@ROWCOUNT

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


6
投票
@@ROWCOUNT

应该可以工作 - 这是找出已删除行数的正确方法。如果您尝试从应用程序中删除某些内容,那么您需要使用

SET NOCOUNT ON

根据

MSDN

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


因此,如果您尝试使用来自 ADO.NET 等的

@@ROWCOUNT

的结果,那么

SET NOCOUNT ON
肯定会有所帮助。
    


1
投票
@@rowcount

的情况,例如当您想知道已删除值的不同计数而不是总数时。在这种情况下,您必须执行以下操作:


delete from mytable where datefield = '5-Oct-2008' output deleted.datefield into #doomed select count(distinct datefield) from #doomed

OP中的语法错误是因为
output

deleted
字段名称之前没有包含
datefield
    


0
投票

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

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


0
投票


0
投票

SELECT @ErrorVar = @@ERROR, @RowCountVar = @@ROWCOUNT

当尝试获取@@error AND @@ROWCOUNT时
因为读取@@error会重置@@ROWCOUNT,
事件 PRINT 语句将重置 @@ROWCOUNT

learn.microsoft.com 上有关于此的示例。

https://learn.microsoft.com/en-us/sql/t-sql/functions/error-transact-sql?view=sql-server-ver16

© www.soinside.com 2019 - 2024. All rights reserved.