如何在单个查询中根据where条件获取Count(*)和表数据



我有一个这样的存储过程:

create procedure sp_testsp
@param1 nvarchar(800),
@count bigint output
as 
begin 
select * from tbl_test tt where tt.col1 = @param1;
set @count = select Count(*) from tbl_test tt where tt.col1 = @param1;
end

在上面的示例中,我将根据两个查询中的位置获得表数据和总行计数。这工作得很好,但在我的实际情况中,选择查询很大,并且像上面那样调用两次,一次用于表,第二次用于计数,这会耗费时间。

只是想知道是否有任何有效的方法来做到这一点,我不知道和可能在一个单一的查询,而不是调用相同的一个两次?

我已经尝试了一点不同的方式,这也工作,但仍然涉及调用查询两次,执行的时间是相同的:

Select * ,
(select count(*) from tbl_test tt where tt.col1 = @param1) as TotalCount
from tbl_test tt where tt.col1 = @param1;

感谢您的帮助。

可以使用

SELECT @@ROWCOUNT;

如果行数大于20亿,则使用ROWCOUNT_BIG

你可以在https://learn.microsoft.com/vi-vn/sql/t-sql/functions/rowcount-transact-sql?view=sql-server-2017找到更多

如果您想返回相同记录集中的计数而不返回多个记录集,您可以使用count()over()

例如

select *, count(*) over() as Numrows
from tbl_test tt 
where tt.col1 = @param1;

或者如果结果大于输出数据类型所建议的int,则

select *, count_big(*) over() as Numrows
from tbl_test tt 
where tt.col1 = @param1;

同样如前所述,如果您想保留第二个结果集,您可以使用@@rowcountrowcount_big()将计数分配给输出变量。

您可以使用COUNT()和OVER()来实现您的目标。请检查以下查询,不要忘记更改位置条件。您也可以在演示链接中查看:http://sqlfiddle.com/#!18/d9c68/5

SELECT *, COUNT(*) OVER() as TotalRow
FROM tbl_test
WHERE Name LIKE '%Name%'

相关内容

  • 没有找到相关文章

最新更新