12

Je viens d'avoir un travail planifié SQL Server plus long que la normale, et j'aurais vraiment pu le faire en définissant un délai d'attente pour l'arrêter après un certain laps de temps.Délai d'attente de l'agent SQL Server

Je suis peut-être un peu aveugle à ce sujet, mais je n'arrive pas à trouver un moyen de définir un délai d'attente pour un travail. Est-ce que quelqu'un sait comment le faire?

Merci

+1

+1 Il n'y a pas apparente propriété « délai d'attente » dans l'éditeur d'emploi. Je suis intéressé par ce que les gens proposent. – Tomalak

+0

Je pense que vous auriez à ajouter un paramètre de type WAITFOR dans le SQL. –

Répondre

10

Nous faisons quelque chose comme le code ci-dessous dans le cadre d'un sous-système de traitement du travail de nuit - il est plus compliqué que cela fait en réalité; par exemple, nous traitons plusieurs ensembles interdépendants d'emplois, et lire dans les noms d'emploi et les valeurs de délai d'attente des tables de configuration - mais cette capture l'idée:

DECLARE @JobToRun NVARCHAR(128) = 'My Agent Job' 
DECLARE @dtStart DATETIME = GETDATE(), @dtCurr DATETIME 
DECLARE @ExecutionStatus INT, @LastRunOutcome INT, @MaxTimeExceeded BIT = 0 
DECLARE @TimeoutMinutes INT = 180 

EXEC msdb.dbo.sp_start_job @JobToRun 
SET @dtCurr = GETDATE() 
WHILE 1=1 
BEGIN 
    WAITFOR DELAY '00:00:10' 
    SELECT @ExecutionStatus=current_execution_status, @LastRunOutcome=last_run_outcome 
    FROM OPENQUERY(LocalServer, 'set fmtonly off; exec msdb.dbo.sp_help_job') where [name] = @JobToRun 
    IF @ExecutionStatus <> 4 
    BEGIN -- job is running or finishing (not idle) 
     SET @dtCurr=GETDATE() 
     IF DATEDIFF(mi, @dtStart, @dtCurr) > @TimeoutMinutes 
     BEGIN 
      EXEC msdb.dbo.sp_stop_job @[email protected]     
      -- could log info, raise error, send email etc here 
     END 
     ELSE 
     BEGIN 
      CONTINUE 
     END 
    END 
    IF @LastRunOutcome = 1 -- the job just finished with success flag 
    BEGIN 
     -- job succeeded, do whatever is needed here 
     print 'job succeeded'         
    END 

END 
2

Quel genre de travail est-ce? Vous pouvez envisager de placer l'ensemble du travail dans un script TSQL dans une boucle While. La condition à vérifier serait évidemment la différence de temps entre l'heure actuelle et l'heure de début du travail.

Raj

+0

Avec ce travail spécifique, je pourrais le diviser ... J'espérais juste qu'il pourrait y avoir une "bonne" solution. Merci –

Questions connexes