Ben sırayla çalışması gereken birkaç SQL Server Agent işleri var. Yürütülmesi gereken işlerle ilgili güzel bir genel bakış sağlamak için, diğer işleri bir çağrı ile çağıran bir ana iş yarattım EXEC msdb.dbo.sp_start_job N'TEST1'
. sp_start_job
İş dek anında bitirir (İş Adım 1), ama sonra bekle benim ana iş istiyorum TEST1
sonraki işi çağırmadan önce tamamladı.
Bu yüzden iş çağrıldıktan hemen sonra yürütülmeye başlayan bu küçük komut dosyasını yazdım (İş Adımı 2) ve ana işi alt iş bitene kadar beklemeye zorlar:
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;
Bu yeterince iyi çalışıyor. Ama daha akıllı ve / veya daha güvenli ( WHILE 1 = 1
?) Çözümlerin mümkün olması gerektiğini hissettim .
Aşağıdaki şeyleri merak ediyorum, umarım bana bazı bilgiler verebilirsin:
- Bu yaklaşımla ilgili sorunlar nelerdir?
- Bunu yapmanın daha iyi bir yolunu önerebilir misiniz?
(Bu soruyu ilk önce StackOverflow'a gönderdim , çünkü kodun geliştirilmesine odaklanıyordum. Hala geçerli. Ama benim tahminim, buradaki insanların genel olarak bunu neden böyle yapmaya çalışmamam gerektiğini söyleyecek daha akıllı şeyleri olacağı ' şimdi yapıyorum veya iyi alternatifler sunuyorum.)
DÜZENLEME (25 Temmuz)
Görünüşe göre senaryo ile çok fazla yanlış değil, onunla ilgili sorunları gösteren düşük cevap sayısına göre :-) Bu tür komut dosyalarına alternatif olarak, bunlar için tasarlanmış bir araç kullanmak gibi görünüyor görevleri (SQL Sentry Event Manager veya ... gibi) - veya böyle bir aracı kendiniz yazmak için. Şu anki şirketimde böyle bir araç satın almayacağız, bu yüzden şimdilik senaryoya sadık kalacağım.