SQL存储过程OUTPUT返回多行

Kai*_*ran 3 sql sql-server stored-procedures sql-server-2008

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

这是我的存储过程创建:

CREATE PROCEDURE spGetAllUntouchedReportID
@ReportID int OUTPUT

AS
BEGIN
    SELECT @ReportID=Report.ReportID
    FROM Report
    WHERE Report.Status IS NULL
END
Run Code Online (Sandbox Code Playgroud)

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

DECLARE @ReportID int
EXECUTE spGetNextReportID
@ReportID OUTPUT
Print @ReportID
Run Code Online (Sandbox Code Playgroud)

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

以下是报告表的示例集:

ReportID  Status
1         NULL
2         Incomplete
3         NULL
Run Code Online (Sandbox Code Playgroud)

打印出来的程序打印出:

3
Run Code Online (Sandbox Code Playgroud)

代替:

1
3
Run Code Online (Sandbox Code Playgroud)

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

Tar*_*ryn 12

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

CREATE PROCEDURE spGetAllUntouchedReportID

AS
BEGIN
    SELECT Report.ReportID
    FROM Report
    WHERE Report.Status IS NULL
END
Run Code Online (Sandbox Code Playgroud)

这将返回具有a Status的所有值null.

请参阅SQL Fiddle with Demo


Gor*_*off 10

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

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

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