可以从CTE返回记录和计数吗?

时间:2013-01-09 00:23:56

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

假设我有一个存储过程,它有一个名为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来完成。

2 个答案:

答案 0 :(得分:4)

您可以将值直接放入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。

答案 1 :(得分:1)

不幸的是,你无法做你想做的事。 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