计算存储过程返回的行数

时间:2013-01-23 07:27:49

标签: sql sql-server-2008

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

7 个答案:

答案 0 :(得分:24)

选择@@rowcount

SELECT @@ROWCOUNT;

执行存储过程后。

答案 1 :(得分:4)

您可以定义输出变量:

create procedure x
    (@p1 int output)
as
    select @p1 = count(*) 
    from Table

答案 2 :(得分:1)

Create procedure procedurename
AS
Begin

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

End

Exec Procedurename

Select @@rowcount

答案 3 :(得分:1)

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

CREATE PROCEDURE NOMBRE_PROCEDIMIENTO
   as
BEGIN
   if EXISTS (SELECT * from NOMBRE_TABLA WHERE CONDITIONS HERE)
     BEGIN
       SELECT @@ROWCOUNT
     END
END

答案 4 :(得分: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')

答案 5 :(得分:0)

答案是使用@@ROWCOUNT仍然有效,但我不建议像existing answer一样直接在EXEC之后运行。

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<>fiddle demo


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

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<>fiddle demo

答案 6 :(得分:0)

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

a。暂时修改存储过程以将结果数据集转储到表中。如果不能更改存储过程,则用“声明”替换“更改过程”并删除结尾,如果不可选则提供参数值,并作为查询执行,将数据集转储到表中。

b。编写表格脚本,然后使用SSMS删除表格。

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

d。计算记录。