【问题标题】:SQL Stored Procedure OUTPUT Return Multiple RowsSQL 存储过程 OUTPUT 返回多行
【发布时间】:2013-04-21 00:29:32
【问题描述】:

我需要返回一个报告表中尚未处理的所有报告的列表。我正在为此过程使用存储过程。

这是我创建的存储过程:

CREATE PROCEDURE spGetAllUntouchedReportID
@ReportID int OUTPUT

AS
BEGIN
    SELECT @ReportID=Report.ReportID
    FROM Report
    WHERE Report.Status IS NULL
END

这就是我调用存储过程的方式:

DECLARE @ReportID int
EXECUTE spGetNextReportID
@ReportID OUTPUT
Print @ReportID

本质上是一个 C# 应用程序将连接并获取结果集,但我正在使用调用对其进行测试。我的问题是对存储过程的调用只打印它找到的最后一个结果。

以下是报表表的示例集:

ReportID  Status
1         NULL
2         Incomplete
3         NULL

打印出对过程的调用:

3

代替:

1
3

如何让我的存储过程存储它从存储过程返回的集合并调用它来打印每一个?这也可能出现在其他存储过程中,我需要执行具有多列并需要返回整个集合的 Select *

【问题讨论】:

  • 您是否有任何理由使用输出变量返回结果?为什么不直接使用 select 语句,例如:SELECT ReportID FROM Report WHERE Status IS NULL?
  • @ƉiamondǤeezeƦ 我是 SQL 存储过程的新手,从我看到的示例中我看到他们使用 OUTPUT 来存储结果,但显然这仅适用于单个值。
  • sqlzoo.net 提供交互式 SQL 教程,您可能会发现这些教程有助于您了解存储过程和一般 SQL。

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

OUTPUT 可以保存一个值。如果要返回值列表,则应将过程更改为以下内容:

CREATE PROCEDURE spGetAllUntouchedReportID

AS
BEGIN
    SELECT Report.ReportID
    FROM Report
    WHERE Report.Status IS NULL
END

这将返回所有具有Statusnull 的值。

SQL Fiddle with Demo

【讨论】:

  • 这是有用的信息,也是我不知道的好工具,谢谢!
【解决方案2】:

我的建议是把你的存储过程变成一个函数:

CREATE function spGetAllUntouchedReportID
@ReportID int OUTPUT
returns table as
    return (SELECT @ReportID=Report.ReportID
            FROM Report
            WHERE Report.Status IS NULL
           )

存储过程之间返回和共享值的主题提供了许多解决方案。 Erland Sommerskog 对此主题有一个excellent blog article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2020-07-02
    • 2022-11-25
    • 2016-12-25
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多