我有一个这样的存储过程:
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;
同样如前所述,如果您想保留第二个结果集,您可以使用@@rowcount
或rowcount_big()
将计数分配给输出变量。
您可以使用COUNT()和OVER()来实现您的目标。请检查以下查询,不要忘记更改位置条件。您也可以在演示链接中查看:http://sqlfiddle.com/#!18/d9c68/5
SELECT *, COUNT(*) OVER() as TotalRow
FROM tbl_test
WHERE Name LIKE '%Name%'