2013-05-24 5 views
0

Я новичок в хранимых процедурах, и я создал этот курсор, который будет запускаться в полночь каждую ночь и прокручивать запись последних дней, если ее не прекратить. При выполнении я получаю сообщение об ошибке каждый раз. Я не уверен, что вызывает его. Любая помощь приветствуется.SQL ERROR на хранимой процедуре

Msg 102, Level 15, State 1, процедура nt_rollover_charge, линия 38 Неправильный синтаксис около 'nt_cursor'.

CREATE PROCEDURE nt_rollover_charge 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     DECLARE @id VARCHAR(20); 
     DECLARE nt_cursor CURSOR FOR 
     SELECT DISTINCT log_id 
     FROM log_book 
     WHERE test_id = '3' 
       AND nt_dc_status = 'FALSE' 
       AND nt_current_date = 'TRUE'; 

     OPEN nt_cursor 

     FETCH NEXT FROM nt_cursor INTO @id 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      UPDATE log_book 
      SET nt_current_date = 'False' 
      WHERE log_id = @id 

      INSERT INTO log_book 
         (mrn, 
         fin, 
         ref_dr, 
         tech, 
         equip_id, 
         hookup_id, 
         indication, 
         abnormality, 
         location_id, 
         test_id, 
         charged, 
         start_date, 
         nt_rollover_date, 
         nt_dc_status, 
         nt_current_date) 
      (SELECT mrn, 
        fin, 
        ref_dr, 
        tech, 
        equip_id, 
        hookup_id, 
        indication, 
        abnormality, 
        location_id, 
        test_id, 
        NULL, 
        start_date, 
        getdate(), 
        'FALSE', 
        'TRUE' 
      FROM log_book 
      WHERE @id = log_id) 

      -- This is executed as long as the previous fetch succeeds. 
      FETCH NEXT FROM nt_cursor INTO @id 
     END 

     CLOSE nt_cursor 

     DEALLOCATE nt_cursor 
    END 
+0

'INSERT INTO log_book .... (SELECT' должен быть' INSERT INTO log_book .... SELECT' без круглых скобок. Не похоже, что вам все равно нужен курсор. –

+0

также, я думаю, вы могли бы сделать это без курсоров ... –

+0

@MartinSmith Исходный TSQL, отправленный OP, не имел 'END' в конце процедуры, поэтому он не разобрал и не дал ошибку выше. После вашей ревизии существует' END' , и код правильно анализируется (конечно, это что-то другое). – Pondlife

ответ

1

Так первый, вы не должны использовать курсор, как поражения цели с помощью SQL и базы данных, которая устанавливается на основе операций. просто написать свои предложения, как так:

Update Log_book set 
nt_current_date = 'False' 
from 
Log_book inner join 
Log_book L2 
on L2.log_id = log_book.log_id 
where 
L2.test_id = '3' and L2.nt_dc_status = 'FALSE'; 

INSERT INTO log_book(mrn, fin, ref_dr, tech, equip_id, hookup_id, indication,  abnormality, location_id, test_id, charged, start_date, nt_rollover_date, nt_dc_status,  nt_current_date) 
SELECT log_book.mrn, log_book.fin, log_book.ref_dr, log_book.tech, log_book.equip_id, log_book.hookup_id, log_book.indication,  log_book.abnormality, log_book.location_id, log_book.test_id, null, log_book.start_date, getdate(), 'FALSE', 'TRUE' 
      FROM log_book 
inner join 
Log_book L2 
on L2.log_id = log_book.log_id 
where 
L2.test_id = '3' and L2.nt_dc_status = 'FALSE'; 

Как для фактического выпуска, что вы размещены только 33 строк, но произошла ошибка в строке 38. Есть ли у вас оператор END в конце хранимой процедуры?

Смежные вопросы