有没有办法从 long-运行 SQL 服务器存储过程中获取数据的第一页?

Is there a way to get just the first page of data from a long-running SQL Server stored procedure?

我的最终需求是在 Web API 页面上呈现一些报告(SQL 服务器存储过程的结果)。

挑战在于 return 此数据的存储过程非常慢 - 有时 运行 需要几分钟。右脑(或左脑)的用户不会发现这个看似无休止的延迟 acceptable,因此我想知道是否有办法只显示第一页(比如 40 或 50 行数据)作为 "pacifier" 给他们,而其余的在后续页面上呈现 "behind the scenes"。

我知道以这种方式 呈现 数据(一次一页)很常见,但实际上是否可以 "slice up" 中的存储过程这种方式可以加快速度,即无需更改存储过程本身 - 仅来自 Web API 应用程序中的 C#(或 Javascript)?

我能想到的唯一其他可行的选择(以及它是否可行还有待商榷)是将已保存到 .xlsx(或 .csv)文件的预 运行 报告存储到服务器,可以从 Web API 应用程序和 converted/massaged 访问它们以显示在页面上。这将需要将文件从客户端实用程序发送到服务器计算机 (!),并且可能在服务器 (!) 上使用 Excel Interop。

这个无赖的最后避难所是只向用户展示一只跳舞的熊玩杂耍小猫的 .gif 或其他东西,同时存储过程正在运行。

更新

两个答案都很好,而且作为后退运行ner(弱者的支持者),我选择了得分较少的猫。

受这两只猫的启发,我想我会做的是在创建每个 Excel 报告时向我的 Web API 应用程序发送一个 "message",以存储服务器上 table 中的数据(通过调用相同的 SP)。当用户浏览到提供的 link 时,报告数据将可供用户使用。当他们实际这样做时(通常至少几分钟后),table 将填充来自 SP 的数据,随后页面的呈现最多应该是几秒钟而不是几分钟。

可能我会安排一个在后台运行的作业,并将 SP 的结果存储在 table 中,并且可以从 Web api 作为一种缓存访问。

您可以在 sql 服务器或使用 Hangfire

安排作业

不具体了解您使用的是什么或如何呈现存储过程的结果。实际上,我会推荐定期 pre-running 大型报告,这将在正常时间释放资源,并允许用户 "skip" 等待。然而,客户端可能无法直接访问托管数据库的服务器计算机,设置具有必要安全协议的 FTP 服务器可能是在服务器和客户端之间自动传输文件的最简单方法。 (SSIS 有非常快速和简单的拖放界面,用于设置需要连接到 ftp 的作业)

您还可以创建一个仅 returns 结果的一小部分的重复存储过程,调用它并在主过程仍然 运行 时呈现它(您可能需要设置建立某种计时器,它会不断检查主过程是否已经完成)