Я поддерживаю систему управления персоналом и учета рабочего времени. Мы перенесли его сервер с 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
Я расстроен, потому что я не знаю, что еще может быть причиной этого.
Ждем всей вашей помощи.