Sql 是否可以从CTE返回记录和计数?
假设我有一个存储的proc,它有一个名为Sql 是否可以从CTE返回记录和计数?,sql,sql-server,sql-server-2008,common-table-expression,Sql,Sql Server,Sql Server 2008,Common Table Expression,假设我有一个存储的proc,它有一个名为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 Tem
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
消失,此操作将中断。我是否可以将return参数的值设置为我的CTE中的总行数并从10-20返回行数
我想我可能必须使用临时表来完成这项工作,但我很好奇是否可以使用CTE来完成。您可以将值直接输入临时表:
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。不幸的是,您无法执行您试图执行的操作。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
可能的复制实际上可能不是,因为它返回一个额外的列,而不是一个输出参数。是的,没有骰子。临时桌可能是我最好的选择?可能。。。您可以将:
SELECT@Count=Count(*)从Temp
更改为SELECT@Count=@@ROWCOUNT
?@malk,它只返回关于所选10行的信息,而不是未经筛选返回的总数。有时两个单独的查询可以更好地解决问题。Paul White在Sql Server Central上发表了一篇文章,介绍了测试各种方法的分页。