Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MS SQL Server-游标内的游标花费很长时间_Sql Server - Fatal编程技术网

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之间的联接结果。