【问题标题】:Get row count of all output of proc in sql server获取sql server中proc所有输出的行数
【发布时间】:2019-09-05 06:18:51
【问题描述】:

如何获取存储过程中所有输出的行数?

例如

Create Proc Test 
AS Begin 
  select top 10 * from sysobjects 
  select top 20* from sysobjects 
End

@@rowcount 将返回输出行数。但就我而言,有 2 个输出。 @@rowcount 将只返回最后一个输出。

exec Test
select @@rowcount 

这只会返回 20。但我需要 10、20

有什么方法可以实现吗?

【问题讨论】:

  • 如文档中所述 docs.microsoft.com/en-us/sql/t-sql/functions/… @@rowcount 返回受最后一条语句影响的行数。要获取 1020 您需要在存储过程中执行此操作
  • 您可以确保SET NOCOUNTOFF 然后解析“x 行受影响”消息。但是就像其他答案中已经建议的那样,在存储过程本身内部计算这个要干净得多
  • 给出的过程是样本,在生产中有多个输出的过程。我看到人们建议在 proc 中计数。问题是我无法更改 procs 中的任何内容。但我需要影响行数。
  • @MartinSmith :好的建议将尝试解析 x 行受影响的消息。有什么线索可以在变量中获取这些消息?

标签: sql sql-server stored-procedures rowcount


【解决方案1】:
CREATE PROCEDURE TestRowCount   
    @rowcount1 INT OUTPUT,
    @rowcount2 INT OUTPUT
AS
BEGIN
  select top 10 * from sysobjects 
  SET @rowcount1 = @@ROWCOUNT
  select top 20* from sysobjects 
  SET @rowcount2 = @@ROWCOUNT
END

调用过程如下:

DECLARE @rowcount1 INT,
        @rowcount2 INT;
EXEC dbo.TestRowCount @rowcount1 = @rowcount1 OUTPUT, -- int
                      @rowcount2 = @rowcount2 OUTPUT  -- int

【讨论】:

    【解决方案2】:

    试试这个方法:

    Create Proc Test 
    AS Begin 
      select top 10 * from sysobjects 
      select @@rowcount 
      select top 20* from sysobjects 
      select @@rowcount 
    End
    

    然后执行查询:

    exec Test
    

    【讨论】:

      【解决方案3】:

      函数@@ROWCOUNT 返回受最后一条语句影响的行数,因此一种可能的方法(从所有SELECT 语句中获取总行数)是在存储过程中定义一个output 参数:

      程序:

      CREATE PROCEDURE TestRowCount 
          @RowCount int OUTPUT
      AS 
      BEGIN 
          SET @RowCount = 0
      
          select top 10 * from sysobjects
          SET @RowCount = @RowCount + @@ROWCOUNT
      
          select top 20 * from sysobjects 
          SET @RowCount = @RowCount + @@ROWCOUNT
      END
      

      结果:

      DECLARE @RC int
      DECLARE @RowCount int
      EXECUTE @RC = TestRowCount @RowCount OUTPUT
      SELECT @RowCount
      

      如果您想从每个 SELECT 语句中获取行数,请使用以下内容:

      CREATE PROCEDURE TestRowCount
      AS 
      BEGIN 
          CREATE TABLE #Tmp (RC int)
      
          select top 10 * from sysobjects
          INSERT INTO #Tmp (RC) VALUES (@@ROWCOUNT)
      
          select top 20 * from sysobjects 
          INSERT INTO #Tmp (RC) VALUES (@@ROWCOUNT)
      
          SELECT * FROM #Tmp
          DROP TABLE #Tmp
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多