ฉันมีงานตัวแทนของเซิร์ฟเวอร์ SQL หลายงานที่ควรเรียกใช้ตามลำดับ เพื่อให้ภาพรวมที่ดีของงานที่ควรจะดำเนินการฉันได้สร้างงานหลักที่เรียกงานอื่น ๆ EXEC msdb.dbo.sp_start_job N'TEST1'
ที่มีการเรียกร้องให้ sp_start_job
เสร็จสิ้นทันที (งานขั้นตอนที่ 1) แต่แล้วฉันต้องการงานหลักของฉันจะรอจนกว่างานTEST1
จะเสร็จสิ้นก่อนที่จะเรียกงานต่อไป
ดังนั้นฉันจึงได้เขียนสคริปต์ขนาดเล็กนี้ที่เริ่มดำเนินการทันทีหลังจากงานถูกเรียก (ขั้นตอนงาน 2) และบังคับให้งานหลักรอจนกว่างานย่อยจะเสร็จสิ้น:
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;
มันใช้งานได้ดีพอ แต่ฉันได้รับความรู้สึกที่ชาญฉลาดและ / หรือWHILE 1 = 1
วิธีแก้ปัญหาที่ปลอดภัยกว่า ( ?) ควรเป็นไปได้
ฉันอยากรู้เกี่ยวกับสิ่งต่าง ๆ ต่อไปนี้หวังว่าคุณจะสามารถให้ข้อมูลเชิงลึกแก่ฉัน:
- อะไรคือปัญหาของวิธีการนี้?
- คุณช่วยแนะนำวิธีที่ดีกว่าให้ทำสิ่งนี้ได้ไหม?
(ฉันโพสต์คำถามนี้ที่StackOverflowก่อนเพราะฉันมุ่งเน้นไปที่การปรับปรุงโค้ดยังคงใช้ได้ แต่ฉันเดาว่าคนทั่วไปที่นี่จะมีสิ่งที่ฉลาดกว่าที่จะพูดเกี่ยวกับสาเหตุที่ฉันไม่ควรพยายามทำสิ่งนี้ในแบบของฉัน m ทำมันตอนนี้หรือเสนอทางเลือกที่ดี)
แก้ไข (25 กรกฎาคม)
เห็นได้ชัดว่าสคริปต์ของฉันไม่ผิดมากนักตามคำตอบที่มีจำนวนน้อยซึ่งชี้ให้เห็นปัญหาที่เกิดขึ้นกับมัน :-) ทางเลือกของสคริปต์ประเภทนี้ดูเหมือนจะใช้เครื่องมือที่ออกแบบมาสำหรับสิ่งเหล่านี้ งาน (เช่น SQL Sentry Event Manager หรือ ... ) - หรือเพื่อเขียนเครื่องมือด้วยตัวเอง เราจะไม่ซื้อเครื่องมือเช่นนี้ที่ บริษัท ปัจจุบันของฉันดังนั้นตอนนี้ฉันจะติดกับสคริปต์