我有要求得到记录的总数以及分页.目前,我正在sql Server 2012中列出如下所示.这需要一个单独的查询才能得到计数. sql Server 2012中有没有改进的方法?
ALTER PROCEDURE dbo.tpGetPageRecords ( @OffSetRowNo INT,@FetchRowNo INT,@TotalCount INT OUT ) AS SELECT CSTNO,CSTABBR FROM DBATABC WHERE CSTABBR LIKE 'A%' ORDER BY CSTNO OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS FETCH NEXT @FetchRowNo ROWS ONLY SET @TotalCount = (SELECT COUNT(*) FROM DBATABC WHERE CSTABBR LIKE 'A%') GO
解决方法
如果我们被允许更改合同,您可以:
SELECT CSTNO,CSTABBR,COUNT(*) OVER () as TotalCount FROM DBATABC WHERE CSTABBR LIKE 'A%' ORDER BY CSTNO OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS FETCH NEXT @FetchRowNo ROWS ONLY
现在,总计将作为结果集中的单独列提供.不幸的是,没有办法把这个值赋给同一个语句中的一个变量,所以我们不能再提供它作为一个OUT参数.
这使用OVER
clause(自2005年以来可用)允许在整个(无限制)结果集中计算聚合,而不需要分组.