Mam kilka zadań agenta SQL Server, które powinny działać sekwencyjnie. Aby zachować ładny przegląd zadań, które powinny zostać wykonane, utworzyłem główne zadanie, które wywołuje inne zadania z wywołaniem EXEC msdb.dbo.sp_start_job N'TEST1'
. Do sp_start_job
wykończenia błyskawicznie Job (etap 1), ale potem chcę moje główne zadanie czekać aż zadanie TEST1
zostało zakończone przed wywołaniem następnej pracy.
Napisałem więc ten mały skrypt, który zaczyna się wykonywać zaraz po wywołaniu zadania (Etap 2) i zmusza główne zadanie do czekania, aż zadanie podrzędne się zakończy:
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;
To działa wystarczająco dobrze. Ale mam wrażenie, że mądrzejsze i / lub bezpieczniejsze ( WHILE 1 = 1
?) Rozwiązania powinny być możliwe.
Jestem ciekawy następujących rzeczy, mam nadzieję, że możesz podać mi pewne informacje:
- Jakie są problemy z tym podejściem?
- Czy możesz zasugerować lepszy sposób na zrobienie tego?
( Najpierw opublikowałem to pytanie na StackOverflow , ponieważ skupiałem się na ulepszeniu kodu. Nadal jest poprawny. Ale zgaduję, że ludzie tutaj będą ogólnie mieli mądrzejsze rzeczy do powiedzenia na temat tego, dlaczego nie powinienem robić tego tak, jak ja ”. robię to teraz lub zapewniam dobre alternatywy).
EDYCJA (25 lipca)
Najwyraźniej nie ma zbyt wiele błędów w moim skrypcie, zgodnie z małą liczbą odpowiedzi wskazujących na problemy z nim :-) Alternatywą dla tego rodzaju skryptów wydaje się być użycie narzędzia zaprojektowanego dla tych skryptów zadania (takie jak SQL Sentry Event Manager lub ...) - lub samodzielne napisanie takiego narzędzia. Nie będziemy kupować takiego narzędzia w mojej obecnej firmie, więc na razie pozostanę przy skrypcie.