【发布时间】:2013-01-06 14:56:40
【问题描述】:
如何计算存储过程以最快方式返回的行数。存储过程返回大约 100K 到 1M 条记录的行。
【问题讨论】:
-
最快的方法是创建一个新的过程来执行计数,在过程执行后使用@@ROWCOUNT 之类的东西会给你返回的行,但如果你只对如果您只需要计数,则无需进行检索和呈现输出列的工作。
标签: sql sql-server-2008
如何计算存储过程以最快方式返回的行数。存储过程返回大约 100K 到 1M 条记录的行。
【问题讨论】:
标签: sql sql-server-2008
【讨论】:
Returns the number of rows affected by the last statement。见technet.microsoft.com/en-us/library/ms187316.aspx
你可以定义输出变量:
create procedure x
(@p1 int output)
as
select @p1 = count(*)
from Table
【讨论】:
答案是使用@@ROWCOUNT仍然有效,但我不建议在EXEC之后直接运行existing 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
一种方法是使用输出参数(与存储过程结果集一样多):
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
【讨论】:
Create procedure procedurename
AS
Begin
Select * from Table --if you want where condition write here
End
Exec Procedurename
Select @@rowcount
【讨论】:
Select @@roucount)。我很可能是从没有相关背景的审核队列中查看的。
我有一个类似的任务,但我不能更改 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')
【讨论】:
获得相同结果的另一种方法
CREATE PROCEDURE NOMBRE_PROCEDIMIENTO
as
BEGIN
if EXISTS (SELECT * from NOMBRE_TABLA WHERE CONDITIONS HERE)
BEGIN
SELECT @@ROWCOUNT
END
END
【讨论】:
到目前为止,唯一对我有用的是:
一个。暂时修改存储过程以将结果数据集转储到表中。如果更改存储过程不是一个选项,则将 Alter Procedure 替换为 Declare 并删除结尾,如果不是可选的,则提供参数值并作为查询将数据集转储到表中执行。
b.编写表格并使用 SSMS 删除它。
c。使用脚本在查询中创建一个虚拟表,并使用 Insert into 和 exec 存储过程来填充它。
d。统计记录。
【讨论】: