Курсор с именем 'tds_cur' не существует - PullRequest
0 голосов
/ 06 января 2020

Я поддерживаю систему управления персоналом и учета рабочего времени. Мы перенесли его сервер с 2008 на 2016 год. В версии 2008 года хранимая процедура работает правильно. При переносе в 2016 г. та же хранимая процедура без каких-либо изменений выдает ошибку «Курсор с именем« tds_cur »не существует».

Это моя хранимая процедура:

ALTER PROCEDURE [SYSADM].[tds] 
    @dt_from DATETME, 
    @dt_to DATETME, 
    @as_depcode VARCHAR(5), 
    @as_seccode VARCHAR(5), 
    @as_subsec VARCHAR(5),
    @as_empcode VARCHAR(5), 
    @as_aproved CHAR(1), 
    @as_dsaproved CHAR(1), 
    @as_userid VARCHAR(8), 
    @dt_rcvdfrom DATETIME,
    @dt_rcvdto DATETIME
AS 
BEGIN
    CREATE TABLE #tmp180
    (
         tds_tdsno CHAR(8), 
         tds_dateout DATETIME NULL, 
         tds_datelate DATETIME NULL,
         tds_criteria CHAR(1), 
         tds_employee CHAR(150), 
         tds_reason CHAR(100) NULL,
         tds_datefiled DATETIME NULL, 
         tds_dateaprvd DATETIME NULL, 
         tds_aprovedby CHAR(5) NULL,
         tds_dtfrom DATETIME NULL, 
         tds_dtto DATETIME NULL, 
         tds_aproved CHAR(1) NULL, 
         tds_dsaprved CHAR(1) NULL,
         tds_userid CHAR(8)
    )

    DECLARE @s_tdsno CHAR(8), @s_criteria CHAR(1), 
            @s_lname CHAR(50), @s_fname CHAR(50), @s_mname CHAR(50),
            @s_empname CHAR(150), @s_reason CHAR(100), 
            @s_aprvdby CHAR(5), @s_empcode CHAR(5),
            @dt_out DATETIME, @dt_late DATETIME,
            @dt_filed DATETIME, @dt_aprvd DATETIME, 
            @s_dep CHAR(5), @s_sec CHAR(5)

    IF @as_aproved <> null and @dt_from <> null and @dt_rcvdfrom is null
    BEGIN
        DECLARE tds_cur CURSOR FOR
        SELECT tds_tdsno, tds_dateout, tds_datelate, tds_criteria, tds_employee, tds_reason, tds_datefiled, tds_dateaprvd, tds_aprovedby, emp_depcode, emp_seccode
        FROM TDS, employee
        WHERE tds_employee = emp_code and emp_depcode like ltrim(@as_depcode) and emp_seccode like ltrim(@as_seccode) and
        emp_subseccode like ltrim(@as_subsec) and tds_employee like ltrim(@as_empcode) and
        tds_datefiled >= @dt_from and tds_datefiled <= @dt_to and (tds_dateaprvd <> null or tds_dateaprvd <> '')
    END
else if @as_aproved <> null and @dt_from <> null and @dt_rcvdfrom <> null
    BEGIN
        DECLARE tds_cur CURSOR FOR
        SELECT tds_tdsno, tds_dateout, tds_datelate, tds_criteria, tds_employee, tds_reason, tds_datefiled, tds_dateaprvd, tds_aprovedby, emp_depcode, emp_seccode
        FROM TDS, employee
        WHERE tds_employee = emp_code and emp_depcode like ltrim(@as_depcode) and emp_seccode like ltrim(@as_seccode) and
        emp_subseccode like ltrim(@as_subsec) and tds_employee like ltrim(@as_empcode) and
        tds_datefiled >= @dt_from and tds_datefiled <= @dt_to and (tds_dateaprvd <> null or tds_dateaprvd <> '') and 
        tds_rcvdte >= @dt_rcvdfrom and tds_rcvdte <= @dt_rcvdto
    END

else if @as_aproved <> null and @dt_from is null and @dt_rcvdfrom <> null
    BEGIN
        DECLARE tds_cur CURSOR FOR
        SELECT tds_tdsno, tds_dateout, tds_datelate, tds_criteria, tds_employee, tds_reason, tds_datefiled, tds_dateaprvd, tds_aprovedby, emp_depcode, emp_seccode
        FROM TDS, employee
        WHERE tds_employee = emp_code and emp_depcode like ltrim(@as_depcode) and emp_seccode like ltrim(@as_seccode) and
        emp_subseccode like ltrim(@as_subsec) and tds_employee like ltrim(@as_empcode) and
        (tds_dateaprvd <> null or tds_dateaprvd <> '') and tds_rcvdte >= @dt_rcvdfrom and tds_rcvdte <= @dt_rcvdto
--      tds_datefiled >= @dt_from and tds_datefiled <= @dt_to and 
    END


IF @as_dsaproved <> null and @dt_from <> null and @dt_rcvdfrom is null
    BEGIN
        DECLARE tds_cur CURSOR FOR
        SELECT tds_tdsno, tds_dateout, tds_datelate, tds_criteria, tds_employee, tds_reason, tds_datefiled, tds_dateaprvd, tds_aprovedby,
         emp_depcode, emp_seccode
        FROM TDS, employee
        WHERE tds_employee = emp_code and emp_depcode like ltrim(@as_depcode) and emp_seccode like ltrim(@as_seccode) and
            emp_subseccode like ltrim(@as_subsec) and tds_employee like ltrim(@as_empcode) and
            tds_datefiled >= @dt_from and tds_datefiled <= @dt_to and (tds_dateaprvd = null or tds_dateaprvd = '')
    END
else IF @as_dsaproved <> null and @dt_from <> null  and @dt_rcvdfrom <> null
    BEGIN
        DECLARE tds_cur CURSOR FOR
        SELECT tds_tdsno, tds_dateout, tds_datelate, tds_criteria, tds_employee, tds_reason, tds_datefiled, tds_dateaprvd, tds_aprovedby,
         emp_depcode, emp_seccode
        FROM TDS, employee
        WHERE tds_employee = emp_code and emp_depcode like ltrim(@as_depcode) and emp_seccode like ltrim(@as_seccode) and
            emp_subseccode like ltrim(@as_subsec) and tds_employee like ltrim(@as_empcode) and
            tds_datefiled >= @dt_from and tds_datefiled <= @dt_to and (tds_dateaprvd = null or tds_dateaprvd = '') and
            tds_rcvdte >= @dt_rcvdfrom and tds_rcvdte <= @dt_rcvdto
    END
else IF @as_dsaproved <> null and @dt_from is null  and @dt_rcvdfrom <> null
    BEGIN
        DECLARE tds_cur CURSOR FOR
        SELECT tds_tdsno, tds_dateout, tds_datelate, tds_criteria, tds_employee, tds_reason, tds_datefiled, tds_dateaprvd, tds_aprovedby,
         emp_depcode, emp_seccode
        FROM TDS, employee
        WHERE tds_employee = emp_code and emp_depcode like ltrim(@as_depcode) and emp_seccode like ltrim(@as_seccode) and
            emp_subseccode like ltrim(@as_subsec) and tds_employee like ltrim(@as_empcode) and
            (tds_dateaprvd = null or tds_dateaprvd = '') and tds_rcvdte >= @dt_rcvdfrom and tds_rcvdte <= @dt_rcvdto
--          tds_datefiled >= @dt_from and tds_datefiled <= @dt_to and 
    END
OPEN tds_cur

FETCH NEXT FROM tds_cur INTO @s_tdsno, @dt_out, @dt_late, @s_criteria, @s_empcode, @s_reason,
                @dt_filed, @dt_aprvd,@s_aprvdby, @s_dep, @s_sec
WHILE @@fetch_status = 0


BEGIN

    SELECT @s_lname= emp_lname FROM employee WHERE emp_code = @s_empcode
    SELECT @s_fname = emp_fname FROM employee WHERE emp_code = @s_empcode
    SELECT @s_mname = emp_midname FROM employee WHERE emp_code = @s_empcode

    SELECT @s_empname = rtrim(@s_lname)+', '+rtrim(@s_fname)+' '+SUBSTRING(rtrim(@s_mname),1,1)+'.'

/*  if @dt_from is null 
        select @dt_from = @dt_rcvdfrom

    if @dt_to is null 
        select @dt_to = @dt_rcvdto */

    INSERT INTO #tmp180 VALUES(@s_tdsno, @dt_out, @dt_late, @s_criteria, @s_empname, @s_reason,
                    @dt_filed,@dt_aprvd, @s_aprvdby, @dt_from, @dt_to, @as_aproved, 
                    @as_dsaproved, @as_userid)

    FETCH NEXT FROM tds_cur INTO @s_tdsno, @dt_out, @dt_late, @s_criteria, @s_empcode, @s_reason,
                    @dt_filed, @dt_aprvd, @s_aprvdby, @s_dep, @s_sec
END

--CLOSE tds_cur
DEALLOCATE tds_cur

SELECT * FROM #tmp180   


END

И вот как я выполняю хранимую процедуру:

EXEC tds  @dt_from = '12/01/2019 00:00:00', 
@dt_to = '12/31/2019 23:00:00', 
@as_depcode = null,@as_seccode = null, @as_subsec = null,@as_empcode = null, @as_aproved =null,@as_dsaproved =null, @as_userid='USER',@dt_rcvdfrom = null, @dt_rcvdto = null

, и результат:

Сообщение 16916, Уровень 16, Состояние 1, Процедура tds, Строка 70 [Стартовая Строка 0]
Курсора с именем 'tds_cur' не существует.

Сообщение 16916, Уровень 16 , Состояние 1, Процедура tds, Строка 83 [Стартовая Строка 0]
Курсор с именем 'tds_cur' не существует.

Сообщение 16916, Уровень 16, Состояние 1, Процедура tds, Строка 111 [Batch Start Line 0]
Курсор с именем 'tds_cur' не существует.

Я знаю, что курсор не является предпочтительным методом для этого, но нет времени для переписывания кода .

Я пытался поместить deallocate в каждую возможную позицию, вне и внутри l oop, но ничего не получалось.

Настройка сервера для курсора установлена ​​на GLOBAL

Я расстроен, потому что я не знаю, что еще может быть причиной этого.

Ждем всей вашей помощи.

Ответы [ 2 ]

1 голос
/ 06 января 2020

Я подозреваю, что ваши настройки ANSI NULLS изменились в период с 2008 по 2016 год.

Проверьте подробности здесь

Ваш самый быстрый способ сохранить то же поведение, что и раньше, может добавьте

SET ANSI NULLS OFF

в начало Хранимой процедуры, чтобы установить обратную совместимость.

Обратите внимание, что эта опция, вероятно, будет удалена в будущем, поэтому вы захотите посмотреть на Переписав вашу процедуру, также удалите курсоры.

0 голосов
/ 07 января 2020

Вы должны использовать «IS NOT NULL» вместо «<> NULL»

...