Курсор в SQL Server получает только каждую другую запись - PullRequest
0 голосов
/ 29 октября 2019

У нас есть задание агента SQL Server (выполняет хранимую процедуру), которое запускается каждый день и добавляет новые базы данных в наши задания на обслуживание. Я хотел бы создать новую хранимую процедуру, которая удалит все шаги задания из заданий обслуживания для тех баз данных, которые были удалены.

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

DECLARE @dblist TABLE (id int identity (1,1) PRIMARY KEY CLUSTERED,
                       dbname nvarchar(128),
                       job_id uniqueidentifier,
                       step_id int);
DECLARE @dbname nvarchar(128);
DECLARE @stepid int;
DECLARE @jobid uniqueidentifier;
DECLARE @jobname2 sysname;

INSERT INTO @dblist (dbname, job_id, step_id)
SELECT database_name as dbname,
       js.job_id,
       js.step_id
from msdb..sysjobsteps as js
     INNER JOIN msdb..sysjobs as j ON js.job_id = j.job_id
WHERE database_name NOT IN ('master', 'msdb', 'model','tempdb', 'MET', 'default_db')
  AND database_name NOT IN (SELECT sdb.name
                            FROM sys.sysdatabases as sdb
                                 INNER JOIN msdb..sysjobs AS j ON js.job_id = j.job_id
                            WHERE sdb.name = js.database_name );

DECLARE cur CURSOR FOR
    SELECT job_id,
           step_id
    FROM @dblist;

OPEN cur
FETCH NEXT FROM cur INTO @jobid, @stepid;
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC msdb..sp_delete_jobstep @job_id = @jobid, @step_id = @stepid;


    FETCH NEXT FROM cur INTO @jobid, @stepid;
    IF @@FETCH_STATUS <> 0
        BREAK;

END

CLOSE cur;
DEALLOCATE cur;

1 Ответ

0 голосов
/ 29 октября 2019

Для начала, у вас нет запроса ORDER BY в запросе, который определяет курсор.

Однако, если у вас есть такая переменная таблицы, и у нее есть столбец ID в качестве идентификатора,не используйте курсор в первую очередь. Это огромное количество ресурсов, которые не нужны.

Просто используйте простой счетчик и выбирайте данные строка за строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...