【问题标题】:Possible to return records and count from a CTE?可以从 CTE 返回记录和计数吗?
【发布时间】:2013-01-09 00:23:56
【问题描述】:

假设我有一个存储过程,它有一个名为 Count 的返回参数,它由以下 SQL 组成:

with temp as
(
    SELECT ROW_NUMBER() OVER( ORDER BY o.createDate) as rowNum,
           o.orderId
    FROM Orders as o

)
SELECT * FROM temp where rowNum BETWEEEN 10 and 20
SELECT @Count = COUNT(*) FROM Temp

目前这将中断,因为Temp 在第一次选择后消失了。我是否可以将返回参数的值设置为我的 CTE 中的总行数返回 10-20 的行?

我想我可能必须使用临时表来执行此操作,但我很好奇是否可以使用 CTE 来完成。

【问题讨论】:

  • 实际上可能不是因为它返回一个额外的列而不是作为输出参数的东西。
  • 是的,没有骰子。临时表可能是我最好的选择?
  • 可能...您可以将:SELECT @Count = COUNT(*) FROM Temp 更改为 SELECT @Count = @@ROWCOUNT?
  • @malk 只会返回有关所选 10 行的信息,而不是未过滤返回的总数。有时 2 个单独的查询可以更好地工作。 Paul White 在 Sql Server Central 上发表了一篇文章,探讨了测试各种方法的分页。

标签: sql sql-server sql-server-2008 common-table-expression


【解决方案1】:

您可以将值直接放入 temp:

with temp as
(
    SELECT ROW_NUMBER() OVER( ORDER BY o.createDate) as rowNum,
           count(*) over () as cnt,
           o.orderId
    FROM Orders as o

)
SELECT * FROM temp where rowNum BETWEEEN 10 and 20

然后您可以读取每一行的cnt。

【讨论】:

    【解决方案2】:

    不幸的是,你不能做你想做的事。 Gordon 的回答是可以接受的,只是它没有向您的变量返回值。

    您遇到了一个基本问题。 CTE 只允许在其后进行一次查询。

    临时表或表变量将是唯一的方法。除非您将在 CTE 之外再次查找表以返回变量,如下所示:

    with temp as
    (
        SELECT ROW_NUMBER() OVER( ORDER BY o.createDate) as rowNum,
               o.orderId
        FROM Orders as o
    )
    SELECT * FROM temp where rowNum BETWEEEN 10 and 20
    SELECT @Count = COUNT(*) FROM Orders
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2016-03-23
      • 2020-09-02
      • 2019-12-25
      • 1970-01-01
      • 2018-09-25
      相关资源
      最近更新 更多