如何计算存储过程以最快的方式返回的行数。存储过程返回大约100K到1M记录的行。
答案 0 :(得分:24)
答案 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
一种方法是使用输出参数(与存储过程结果集一样多):
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
答案 6 :(得分:0)
到目前为止,唯一对我有用的是:
a。暂时修改存储过程以将结果数据集转储到表中。如果不能更改存储过程,则用“声明”替换“更改过程”并删除结尾,如果不可选则提供参数值,并作为查询执行,将数据集转储到表中。
b。编写表格脚本,然后使用SSMS删除表格。
c。使用脚本在查询中创建一个虚拟表,并使用带有exec存储过程的Insert into来填充它。
d。计算记录。