繁体   English   中英

如何指定要使用的存储过程结果集?

[英]How do I specify which stored procedure result set to use?

我有一个C#类,它调用存储过程如下:

public static ReadOnlyCollection<IDataRow> GetDBSData(Int32 myPeriod, DateTime myWEDate)
{
    string dateFormat = "MM/dd/yyyy";
    string query = string.Format(
        "exec GatherDBSData '{0}', '{1}'",
        myPeriod.ToString(),
        myWEDate.ToString(dateFormat)
    );
    return FileGenerator.GetDataRows(query, DBSMeta.Columns, dict => new DBSDataRow(dict));
}

我遇到的挑战是GatherDBSData存储过程调用了另一个存储过程,而我又得到了两个结果集。 我想要的只是最后一个结果集。 GatherDBSData包含此调用...

exec GatherPaperlessPayPayrollData @Period, @CheckDate

...作为第一件事。 紧接在上方的调用将在数据库中填充我的GatherDBSData sproc进行工作所需的表。

我的问题是-是否可以调用GatherDBSData并指示它仅返回第二个结果集? 或者我可以在GatherDBSData中调用GatherPaperlessPayPayrollData并告诉它我不想查看或使用结果集,所以只返回一个?

如果要指示存储过程仅返回一个结果集,则可以向其添加一个新参数,该参数可以指示要返回多少个/哪个结果集。

如果只想跳过返回的第一个结果集,则可以使用SqlDataReader.NextResult() http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldatareader.nextresult.aspx来获取到第二个结果集。

我第二次遇到了这个完全相同的问题,并且用于此问题的初始发布的解决方法在第二种情况下不起作用。

在场景2中,我有一个SSRS报告,该报告调用了存储过程。 该存储过程调用另一个存储过程,最后,两个结果集都被返回,并且报表尝试使用第一个结果集,而不是第二个结果集。 我只需要第二个结果集。 还有就是一个解决方案。

此问题的解决方案是dyslexicanaboko在回答以下问题时采用的一种非常有创意的方法: 如何抑制从SQL Server中的另一个存储过程调用的存储过程的SELECT输出? 虽然dyslexicanaboko的建议不是在该用户的情况下选择的答案,但事实证明我自己非常有效。

通过将可选参数添加到报表的sproc调用的存储过程中,我可以抑制不需要的结果集的输出。 仅将第二个结果集提供给报告。

新的可选参数:

ALTER PROCEDURE [dbo].[GatherPaperlessPayPayrollData] 
(
    @Period int,
    @CheckDate datetime,
    @Employee  VARCHAR(20) = NULL,
    @silentExecution bit = 0
)

像这样更改存储过程的最后一行:

IF @silentExecution = 0
     SELECT * FROM PaperlessPay;

如下更改对存储过程的调用:

if @custEID is not null
    begin
        exec InterfaceDev..GatherPaperlessPayPayrollData @Period, @CheckDate, @custEID, @silentExecution = 1
    end
else 
    begin
        exec InterfaceDev..GatherPaperlessPayPayrollData @Period, @CheckDate, @silentExecution = 1
    end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM