Sql server MS SQL Server-游标内的游标花费很长时间
我有以下代码:Sql server MS SQL Server-游标内的游标花费很长时间,sql-server,Sql Server,我有以下代码: CREATE OR ALTER PROCEDURE TEST AS DECLARE @text_var nvarchar(200), @num_var numeric(27, 4); DECLARE c_cur1 CURSOR FOR SELECT DISTINCT TOP 2 textID FROM text_table WHERE status = 'App
CREATE OR ALTER PROCEDURE TEST
AS
DECLARE @text_var nvarchar(200),
@num_var numeric(27, 4);
DECLARE c_cur1 CURSOR FOR
SELECT DISTINCT TOP 2
textID
FROM text_table
WHERE status = 'Approved';
OPEN c_cur1;
FETCH NEXT FROM c_cur1
INTO @text_var;
WHILE @@fetch_status = 0
BEGIN
PRINT 'first cursor: ' + @text_var;
DECLARE c_cur2 CURSOR FOR
SELECT TOP 1
numID
FROM num_table
WHERE text = @text_var
ORDER BY cdate DESC;
PRINT 'before opening second cursor';
OPEN c_cur2;
FETCH NEXT FROM c_cur2
INTO @num_var;
WHILE @@fetch_status = 0
BEGIN
PRINT 'Inside second cursor' + @text_var;
END;
CLOSE c_cur2;
DEALLOCATE c_cur2;
FETCH NEXT FROM c_cur1
INTO @text_var;
END;
CLOSE c_cur1;
DEALLOCATE c_cur1;
第二个游标中的文本被打印了很多次,至少应该超过1000次,而我认为应该只有两次
因此,运行此查询至少需要30分钟
如果上面的代码有任何错误,请提出建议。它经常循环到的原因是您将“从c_cur2获取下一个”放错了位置。它应该进入与相关程序关联的BEGIN..END块中,如下所示。事实上,您正在导致一个无限循环
CREATE PROCEDURE TEST AS
DECLARE @text_var nvarchar(200), @num_var numeric(27,4)
DECLARE c_cur1 CURSOR for select distinct top 2 textID from text_table where status = 'Approved';
open c_cur1
fetch next from c_cur1 into @text_var
While @@fetch_status = 0
BEGIN
PRINT 'first cursor: ' + @text_var
declare c_cur2 CURSOR for select top 1 numID from num_table where text = @text_var order by cdate desc;
PRINT 'before opening second cursor'
open c_cur2
fetch next from c_cur2 into @num_var
while @@fetch_status = 0
BEGIN
PRINT 'Inside second cursor' + @text_var
fetch next from c_cur2 into @num_var
END
CLOSE c_cur2
DEALLOCATE c_cur2
FETCH NEXT FROM c_cur1 INTO @text_var
END
CLOSE c_cur1
DEALLOCATE c_cur1
尽管出于学习目的,游标可以被基于集合的解决方案取代。问题可能是您正在使用游标。你在以编程的方式思考。SQL不是一种编程语言,它是一种查询语言。你需要思考你想对一个专栏做什么;不是要对行执行什么操作。在num_table文本列上有索引吗?数据类型nvarchar200是否与变量匹配?与其发布代码,不如向我们提供一些示例数据和预期结果,并解释您的目标。我99%确信会有一个基于数据集的解决方案,这将大大加快速度。有时需要使用游标。我们无法判断是否存在这种情况,因为我们看不到最里面的语句,但嵌套游标几乎没有存在的理由。您实际上是在用命令式代码编写连接。即使这里绝对需要使用游标,也可以让游标遍历text_table和num_table之间的联接结果。