存储过程中的结果集总数

Posted

技术标签:

【中文标题】存储过程中的结果集总数【英文标题】:Total number of Result Sets in Stored Procedure 【发布时间】:2016-02-26 09:20:15 【问题描述】:

在 SQL Server 2008 中,有没有办法在执行存储过程后获取结果集(表)的总数。

假设我有一个内部调用另一个存储过程的存储过程。我想知道它返回了多少个结果集,内部调用的存储过程。

谁能帮我解决这个问题。

例如

CREATE PROCEDURE sp_GetReports
(
    @reportName AS VARCHAR(50)
)
AS
BEGIN
    DECLARE @reportProcName AS VARCHAR(50)

    SELECT  @reportProcName = ReportProcName
    FROM ReportMaster
    WHERE ReportName = @reportName;

    EXEC (@reportProcName)

    /*
    * Need to get here, total numbers of Result Sets (tables) retrived.
    */


END
GO

提前致谢。

【问题讨论】:

我怀疑这是可能的。为什么您的存储过程返回多个结果集?它可能不容易被前端应用程序使用。 在动态存储过程中,根据报表要求,返回多个结果集 @BhaveshHarsora:你试过用@@ROWCount吗? 这与您的实际问题无关,但您应该避免在存储过程中使用 sp_ 前缀。有关详细信息,请参阅here。 Thomas,所写的过程名称只是举例,实际过程名称不同。 【参考方案1】:

你也许可以:

获取存储过程中的行数并将结果作为 OUTPUT 参数检索

利用某种类型的外部表(必须设计这个)

这为您提供了从存储过程返回的行数

USE Northwind
GO

CREATE OR ALTER PROCEDURE dbo.Test (
    @rowCnt int OUTPUT
)
AS

SELECT * FROM dbo.Customers
SET @rowCnt = @@ROWCOUNT
GO

DECLARE 
    @rowCount int

EXEC dbo.Test @rowCount OUTPUT

SELECT @rowCount

【讨论】:

【参考方案2】:

解决方法怎么样?

在每个报告中创建一些计数器变量。 每次在 SELECT 语句之前,递增它。 然后,将其作为 sproc 中的最后一个输出返回。 每个报告都应遵循此约定。

【讨论】:

【参考方案3】:

您可以从内部过程返回带有@@ROWCOUNT 的输出参数,并在 sp_GetReports 中使用它。

【讨论】:

@@ROWCOUNT 返回受最后执行的 tsql 影响的行数,我需要最后一个执行的存储过程返回表计数。所以这个@@ROWCOUNT 在这方面对我没有帮助。

以上是关于存储过程中的结果集总数的主要内容,如果未能解决你的问题,请参考以下文章

基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程

数据访问设计:多个结果集单个存储过程或每个存储过程单个结果集

MySQL 存储过程,获取使用游标查询的结果集

从 Laravel 4 中的 MSSQL 存储过程读取多个结果集

存储过程中的动态 SQL 不返回结果集;在 SSMS 中运行时,我得到了结果

Apache DbUtils:处理从存储过程返回的多个结果集