为什么我会得到"名称已存在的游标"?

Eri*_*tas 32 sql t-sql sql-server cursor

我有这个触发器:

CREATE TRIGGER CHECKINGMAXQTYDAYSVACANCY
    ON TDINCI
AFTER INSERT 
AS
    DECLARE
        @incidentCode int,
        @dateStart datetime,
        @dateEnd datetime,
        @daysAccumulated int,
        @maxDaysAvailable int

    set @daysAccumulated = 0;

    select @incidentCode = CO_INCI from inserted;
    select @maxDaysAvailable = IN_DIAS_GANA from TCINCI
        where CO_INCI = @incidentCode;

    declare detailsCursor CURSOR FOR
        select FE_INIC, FE_FINA from TDINCI
        where CO_INCI = @incidentCode;

    open detailsCursor;

    if CURSOR_STATUS('variable', 'detailsCursor') >= 0
    begin
        fetch next from detailsCursor
            into @dateStart, @dateEnd;

        while @@FETCH_STATUS = 0
        begin
            set @daysAccumulated = @daysAccumulated + (DATEDIFF(DAY, @dateStart, @dateEnd) + 1);

            fetch next from detailsCursor
            into @dateStart, @dateEnd;
        end
        close detailsCursor;
        deallocate detailsCursor;
    end
    IF(@maxDaysAvailable > @daysAccumulated)
    BEGIN
        RAISERROR ('No se pueden ingresar mas dias de los programados en la cabecera de incidencias.', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN 
    END
GO
Run Code Online (Sandbox Code Playgroud)

当我对表TDINCI进行插入时

INSERT INTO TDINCI 
VALUES (1, '20150101', '20150115', '2015-2015')
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

名称为"detailsCursor"的游标已存在.

我打开

open detailsCursor;
Run Code Online (Sandbox Code Playgroud)

并关闭光标.

close detailsCursor;
deallocate detailsCursor;
Run Code Online (Sandbox Code Playgroud)

也许光标的范围有些我无法管理?提前致谢.

小智 76

您正在使用全局游标,每次调用此过程时都会定义该游标并给出相同的错误.

定义本地游标.只要把关键字LOCALCURSOR:

declare detailsCursor CURSOR LOCAL FOR
...
Run Code Online (Sandbox Code Playgroud)

  • 有什么不同 ? (3认同)