5

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

这是我的存储过程创建:

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 * 并且需要返回整个集合

4

2 回答 2

16

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

CREATE PROCEDURE spGetAllUntouchedReportID

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

这将返回所有具有Statusof 的值null

请参阅带有演示的 SQL Fiddle

于 2013-04-21T00:34:33.763 回答
12

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

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

在存储过程之间返回和共享值的主题提供了许多解决方案。Erland Sommerskog 有一篇关于这个主题的优秀博客文章。

于 2013-04-21T00:43:04.410 回答