2014-09-18 3 views
1

У меня есть хранимая процедура в SQL Server, который чистки записи из таблицы, совершая каждый 5000:COMMIT не имеет ошибки BEGIN только при запуске по расписанию?

DECLARE AuditEventCursor CURSOR FOR 
    SELECT E.EVENT_ID 
     FROM XI31AUDIT2..AUDIT_EVENT E 
    WHERE E.START_TIMESTAMP < GETDATE() - 14; 

DECLARE @EventID VARCHAR(64); 
DECLARE @DetailID INT; 
DECLARE @i INT; 
BEGIN 

    --- Initialize variables 
    SET @EventID = ''; 
    SET @DetailID = -1; 
    SET @i = 0; 

    -- Open cursor for records to delete from AUDIT_EVENT 
    OPEN AuditEventCursor; 

    -- Fetch first EVENT_ID 
    FETCH NEXT FROM AuditEventCursor 
    INTO @EventID; 

    -- Loop while we still have records 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     DELETE FROM AUDIT_EVENT 
     WHERE EVENT_ID = @EventID; 

     -- Increment counter and commit every 5000 
     SET @i = @i + 1; 
     IF @i % 5000 = 0    
      COMMIT; 

     -- Fetch next EVENT_ID 
     FETCH NEXT FROM AuditEventCursor 
     INTO @EventID; 
    END; 

    -- Close cursor 
    CLOSE AuditEventCursor; 
    DEALLOCATE AuditEventCursor; 

END; 

Когда я запускаю это вручную в SSMS, она работает просто отлично. Однако, когда я запускаю его как задание в агенте SQL Server, возникает следующая ошибка:

The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION. [SQLSTATE 25000] (Error 3902). 

В чем разница? Я использую ту же команду для выполнения: exec Purge_Audit

Спасибо!

ответ

0

Попробуйте

-- Change value from 0 to 1 
SET @i = 1; 

-- Open cursor for records to delete from AUDIT_EVENT 
OPEN AuditEventCursor; 

-- Fetch first EVENT_ID 
FETCH NEXT FROM AuditEventCursor 
INTO @EventID; 

-- Loop while we still have records 
WHILE @@FETCH_STATUS = 0 
BEGIN 

-- Begin new code 
    IF @i % 5000 = 1 
     BEGIN TRANSACTION 
-- End new code 

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

  • Нет связанных вопросов^_^