由于错误的变量类型而导致游标提取错误



我尝试为 SQL Statments for SQLServer 做一个基准测试。

我在网上找到了一个很好的基准循环:https://github.com/jOOQ/jOOQ/blob/master/jOOQ-examples/Benchmarks/SQLServer/Benchmarking%20SQL%20Server%20(绝对(.sql

DECLARE @ts DATETIME;
DECLARE @repeat INT = 10000;
DECLARE @r INT;
DECLARE @i INT;
DECLARE @dummy VARCHAR;
DECLARE @s1 CURSOR;
DECLARE @s2 CURSOR;
SET @r = 0;
WHILE @r < 5
BEGIN
SET @r = @r + 1
SET @s1 = CURSOR FOR
-- Paste statement 1 here
SELECT 1 x;
SET @s2 = CURSOR FOR
-- Paste statement 2 here
WITH t(v) AS (
SELECT 1
UNION ALL
SELECT v + 1 FROM t WHERE v < 10
)
SELECT * FROM t
SET @ts = current_timestamp;
SET @i = 0;
WHILE @i < @repeat
BEGIN
SET @i = @i + 1
OPEN @s1;
FETCH NEXT FROM @s1 INTO @dummy;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @s1 INTO @dummy;
END;
CLOSE @s1;
END;
DEALLOCATE @s1;
PRINT 'Run ' + CAST(@r AS VARCHAR) + ', Statement 1: ' + CAST(DATEDIFF(ms, @ts, current_timestamp) AS VARCHAR) + 'ms';
SET @ts = current_timestamp;
SET @i = 0;
WHILE @i < @repeat
BEGIN
SET @i = @i + 1
OPEN @s2;
FETCH NEXT FROM @s2 INTO @dummy;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM @s2 INTO @dummy;
END;
CLOSE @s2;
END;
DEALLOCATE @s2;
PRINT 'Run ' + CAST(@r AS VARCHAR) + ', Statement 2: ' + CAST(DATEDIFF(ms, @ts, current_timestamp) AS VARCHAR) + 'ms';
END;
PRINT '';
PRINT 'Copyright Data Geekery GmbH';
PRINT 'https://www.jooq.org/benchmark';

这适用于我测试的语句只有一列它们返回的情况。例如:

Select ID from Items Where ID=2;

但是一旦我尝试选择多行,例如

Select * from Items Where ID=2;

我收到错误:

Msg 16924,级别 16,状态 1,第 135 行 游标获取:数量 INTO列表中声明的变量必须与所选变量匹配 列。

所以这个关注的列是

FETCH NEXT FROM @s1 INTO @dummy;

因此,据我了解,问题是我试图将很多columsn放入虚拟变量中。但是我该如何解决呢?我使用SQL的时间不长,所以任何帮助将不胜感激。

这不是测试查询的有用或简单方法。

它有很多代码,所以不是特别容易,并且使用游标来处理结果,因此它包括在服务器上使用游标处理结果的成本,而游标通常不存在。

通常,只需在 SSMS 中运行查询并查看实际执行计划,可能查看时间和 IO 统计信息,也许查看客户端统计信息。 查询结果应返回给客户端,因为这是生产中发生的情况,在进行基准测试时,应考虑通过网络传输结果所需的时间。

如果需要在不将数据返回给客户端的情况下运行查询,则可以使用类似

go
set statistics io on
set statistics time on
go
drop table if exists #foo;
with q as
(
select ...
from ...
)
select *
into #foo
from q
go 5
set statistics io off
set statistics time off
go

最新更新