21

如何计算存储过程以最快方式返回的行数。存储过程返回大约 100K 到 1M 记录的行。

4

7 回答 7

29

选择@@rowcount

SELECT @@ROWCOUNT;

执行存储过程后。

于 2013-01-23T07:32:30.953 回答
5

您可以定义输出变量:

create procedure x
    (@p1 int output)
as
    select @p1 = count(*) 
    from Table
于 2013-01-23T07:31:55.143 回答
4

答案是 use@@ROWCOUNT仍然有效,但我不建议EXEC现有 answer之后直接运行。

SELECT语句并不总是最后一个语句是存储过程,或者您可能有多个SELECT语句:

设想:

CREATE PROCEDURE p
AS
BEGIN
  CREATE TABLE #t(i INT);
  INSERT INTO #t(i) VALUES (1),(2);
  SELECT i FROM #t;
  DROP TABLE IF EXISTS t;
END

EXEC p;
-- i
-- 1
-- 2

SELECT @@ROWCOUNT;
-- 0 instead of 2

db<>小提琴演示


一种方法是使用输出参数(与存储过程结果集一样多):

CREATE PROCEDURE p(@cnt INT OUT)
AS
BEGIN
  CREATE TABLE #t(i INT);
  INSERT INTO #t(i) VALUES (1),(2);
  SELECT i FROM #t;
  SET @cnt = @@ROWCOUNT;  -- immediately after SELECT
  DROP TABLE IF EXISTS t;
END

DECLARE @i INT;
EXEC p2 @cnt = @i OUT;
SELECT @i;
-- 2

db<>小提琴演示

于 2020-03-15T07:54:49.923 回答
1
Create procedure procedurename
AS
Begin

    Select * from Table --if you want where condition write here

End

Exec Procedurename

Select @@rowcount
于 2014-05-07T12:25:33.320 回答
0

我有一个类似的任务,但有一个限制,我不能改变 SP 来获得计数。因此:

sp_configure 'show advanced options', 1;  
reconfigure;
go

sp_configure 'ad hoc distributed queries', 1;  
reconfigure;  
go

select count(*) from 
    openrowset('SQLOLEDB','Data Source=localhost;Trusted_Connection=yes;
    Integrated Security=SSPI','exec DBNAME..SPName')
于 2016-10-17T10:29:28.510 回答
0

获得相同结果的另一种方法

CREATE PROCEDURE NOMBRE_PROCEDIMIENTO
   as
BEGIN
   if EXISTS (SELECT * from NOMBRE_TABLA WHERE CONDITIONS HERE)
     BEGIN
       SELECT @@ROWCOUNT
     END
END
于 2018-10-05T15:32:32.277 回答
0

到目前为止,唯一对我有用的是:

一种。暂时修改存储过程以将结果数据集转储到表中。如果更改存储过程不是一个选项,则将 Alter Procedure 替换为 Declare 并删除结尾,如果不是可选的,则提供参数值并作为将数据集转储到表中的查询执行。

湾。编写表格并使用 SSMS 删除它。

C。使用脚本在查询中创建一个虚拟表,并使用 Insert into 和 exec 存储过程来填充它。

d。计算记录。

于 2020-10-07T17:50:26.773 回答