SQL存储过程OUTPUT返回多行

时间:2013-04-21 00:29:32

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

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

这是我的存储过程创建:

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 *

2 个答案:

答案 0 :(得分:11)

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

CREATE PROCEDURE spGetAllUntouchedReportID

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

这将返回Status null的所有值。

请参阅SQL Fiddle with Demo

答案 1 :(得分:10)

我的建议是将存储过程转换为函数:

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