Tôi đã có một số công việc SQL Server Agent nên chạy tuần tự. Để giữ một cái nhìn tổng quan tốt đẹp về các công việc nên thực hiện, tôi đã tạo một công việc chính gọi các công việc khác bằng một cuộc gọi đến EXEC msdb.dbo.sp_start_job N'TEST1'
. Kết sp_start_job
thúc ngay lập tức (Công việc Bước 1), nhưng sau đó tôi muốn công việc chính của mình phải đợi cho đến khi công việc TEST1
kết thúc trước khi gọi công việc tiếp theo.
Vì vậy, tôi đã viết kịch bản nhỏ này bắt đầu thực thi ngay sau khi công việc được gọi (Công việc Bước 2) và buộc công việc chính phải đợi cho đến khi công việc phụ kết thúc:
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;
Điều này hoạt động đủ tốt. Nhưng tôi có cảm giác thông minh hơn và / hoặc an toàn hơn ( WHILE 1 = 1
?) Nên có thể.
Tôi tò mò về những điều sau đây, hy vọng bạn có thể cung cấp cho tôi một số hiểu biết:
- Các vấn đề với phương pháp này là gì?
- Bạn có thể đề xuất một cách tốt hơn để làm điều này?
(Tôi đăng câu hỏi này StackOverflow đầu tiên, bởi vì tôi đã tập trung vào cải thiện của mã này. Tuy nhiên hợp lệ. Nhưng tôi đoán là người dân ở đây sẽ nói chung có điều thông minh hơn để nói về lý do tại sao tôi không nên cố gắng làm điều này theo cách tôi' m đang làm điều đó ngay bây giờ, hoặc cung cấp các lựa chọn thay thế tốt.)
EDIT (25 tháng 7)
Rõ ràng không có quá nhiều sai với kịch bản của tôi, theo số lượng câu trả lời thấp chỉ ra vấn đề với nó :-) Cách thay thế cho loại kịch bản này dường như là sử dụng một công cụ được thiết kế cho những điều này các tác vụ (như SQL Sentry Event Manager hoặc ...) - hoặc tự viết một công cụ như vậy. Chúng tôi sẽ không mua một công cụ như vậy tại công ty hiện tại của tôi, vì vậy bây giờ tôi sẽ chỉ sử dụng kịch bản.