Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以从CTE返回记录和计数?_Sql_Sql Server_Sql Server 2008_Common Table Expression - Fatal编程技术网

Sql 是否可以从CTE返回记录和计数?

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

假设我有一个存储的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 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上发表了一篇文章,介绍了测试各种方法的分页。