代码之家  ›  专栏  ›  技术社区  ›  Unsliced

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

  •  45
  • Unsliced  · 技术社区  · 16 年前

    在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 回复  |  直到 9 年前
        1
  •  50
  •   Sam Premdeep Mohanty    10 年前

    你试过了吗? SET NOCOUNT OFF ?

        2
  •  8
  •   Simon    16 年前

    我在sql2000中使用@@rowcount来实现这个目的,没有问题。但是,在检查之前,请确保您没有错误地重置此计数(bol:'此变量由不返回行的任何语句(如if语句)设置为0'。

        3
  •  7
  •   Adly    10 年前

    只要这样做:

    SET NOCOUNT off ;
    SELECT @p1 = @@ROWCOUNT
    

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

        4
  •  4
  •   Ilya Kochetov    16 年前

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

    根据 MSDN @@即使当set nocount为on时,rowcount函数也会更新为as SET NOCOUNT 只影响执行后得到的消息。

    所以,如果你想利用 @行数 例如,来自ADO.NET,然后 设置计数 一定会有帮助的。

        5
  •  1
  •   James L.    9 年前

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

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

    操作中的语法错误是因为 output 不包括 deleted 之前 datefield 字段名。

        6
  •  0
  •   Howard Pinsley    16 年前

    出于好奇,你怎么叫这个程序?(我假设它是一个存储过程?)。我问的原因是存储过程的返回值(在本例中为0)与行集结果(在本例中为单列的单行)之间存在差异。在ADO.NET中,前者通过参数访问,后者通过sqldatareader访问。您是否将过程的返回值误认为行数?

        7
  •  -1
  •   Corey Trager    16 年前

    创建一列ID为的临时表。

    插入到临时表中,选择要删除的ID。这就是你的计数。

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