【问题标题】:How to return two result sets from stored procedure?如何从存储过程中返回两个结果集?
【发布时间】:2019-02-28 12:19:52
【问题描述】:

我在当前页面中有两个查询。它们非常相似,但仍然返回不同数量的记录。这是一个例子:

查询 1

SELECT 
   recid,
   cost,
   cur_year
FROM Info i
   INNER JOIN Extension ex
       ON ex.recid = i.recid
       AND ex.categoryid = i.categoryid
WHERE cur_year = 2018
    AND info_id = 4531

查询 2

SELECT SUM(cost) AS cost_total
FROM Info i
   INNER JOIN Extension ex
       ON ex.recid = i.recid
       AND ex.categoryid = i.categoryid
WHERE cur_year = 2018
    AND info_id = 4531
    AND cost > 0

在这种情况下,查询 1 返回 2 条记录。查询 2 返回 1 条记录。我想知道将这两个放在SP中是否是个好主意?当前代码有两个单独的查询并自动访问数据库两次。我的想法是两个对数据库进行一次调用并返回两个数据集。如果有人有示例如何实现这一点,请告诉我。谢谢。

【问题讨论】:

  • 如果您的客户可以读取两个结果集应该没问题
  • 您使用哪种语言?
  • @a_horse_with_no_name 我刚刚更新了我的问题。 sybase 数据库。
  • 为什么这个标签同时带有tsqlsybase
  • @TabAlleman 出于某种原因,有人决定编辑原始问题。他/她添加了tsql...

标签: tsql stored-procedures sybase resultset


【解决方案1】:

为什么不只包含另一列?存储过程中的两个查询仍然会访问数据库两次。

而且,你可以这样表达:

SELECT recid, cost, cur_date,
       SUM(CASE WHEN cost > 0 THEN cost ELSE 0 END) OVER () as total_cost
FROM Info i INNER JOIN
     Extension ex
     ON ex.recid = i.recid AND
        ex.categoryid = i.categoryid
WHERE cur_date = '2018' AND  -- this is suspicious.  Dates are not years
      info_id = '4531';

【讨论】:

  • 如果我在上面应用您的代码,我将获得超过 2 条记录。看起来sum() 函数需要的记录多于应有的记录。
  • @espresso_coffee 。 . .您应该得到与第一个查询相同的行。
  • 如果我不删除它,我将获得比原始查询中更多的行加上 OVER() 附近的错误消息。
【解决方案2】:

由于某些调用者在交付的第一个结果集时开始返回,因此请在 proc 主体的开头设置 nocount。我知道没有办法让一个查询返回 2 个集合。

set nocount on;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多