Ho diversi lavori di SQL Server Agent che dovrebbero essere eseguiti in sequenza. Per mantenere una buona panoramica dei lavori che devono essere eseguiti, ho creato un lavoro principale che chiama gli altri lavori con una chiamata a EXEC msdb.dbo.sp_start_job N'TEST1'
. Il processo sp_start_job
termina all'istante (Job Step 1), ma poi desidero che il mio lavoro principale attenda il completamento del lavoro TEST1
prima di chiamare il lavoro successivo.
Quindi ho scritto questo piccolo script che inizia l'esecuzione subito dopo che il lavoro è stato chiamato (Job Step 2) e forza il lavoro principale ad attendere fino al termine del lavoro secondario:
WHILE 1 = 1
BEGIN
WAITFOR DELAY '00:05:00.000';
SELECT *
INTO #jobs
FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
@execution_status = 0, @job_aspect = N''JOB''');
IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
BEGIN
BREAK
END;
DROP TABLE #jobs;
END;
Funziona abbastanza bene. Ma ho avuto la sensazione che le soluzioni più intelligenti e / o più sicure ( WHILE 1 = 1
?) Dovrebbero essere possibili.
Sono curioso di sapere le seguenti cose, spero che tu possa fornirmi alcune intuizioni:
- Quali sono i problemi con questo approccio?
- Puoi suggerire un modo migliore per farlo?
(Ho pubblicato prima questa domanda su StackOverflow , perché mi stavo concentrando sul miglioramento del codice. Ancora valido. Ma la mia ipotesi è che le persone qui in generale avranno cose più intelligenti da dire sul perché non dovrei provare a farlo nel modo in cui ' lo sto facendo ora, o fornire buone alternative.)
EDIT (25 luglio)
A quanto pare non c'è molto di sbagliato nel mio script, in base al basso numero di risposte che evidenziano problemi con esso :-) L'alternativa a questo tipo di script sembra essere l'uso di uno strumento progettato per questi attività (come SQL Sentry Event Manager o ...) - o per scrivere tale strumento da soli. Non compreremo uno strumento simile nella mia attuale azienda, quindi per ora mi limiterò a seguire la sceneggiatura.