Tâche de l'Agent SQL: Déterminer combien de temps il a été en cours d'exécution
Le Scénario
Il y a certains Travaux de l'Agent SQL qui sont planifiées pour s'exécuter toutes les quelques minutes pendant la journée.
Il est légitime de fois où il va rater son prochain calendrier parce que c'est toujours en cours d'exécution du programme précédent.
À chaque fois, un travail peut "bloquer". Ce n'est pas de produire un échec (parce que le travail n'a pas encore arrêté). Lorsque cela se produit, le travail peut être arrêtée manuellement et fonctionne très bien, la prochaine fois qu'il s'exécute. Il est conçu pour reprendre là où il l'avait laissé.
Quel est le moyen le plus efficace...?
Je voudrais un moyen de déterminer combien de temps (en secondes) d'une Tâche de l'Agent SQL nommé "JobX" est actuellement en cours d'exécution. Si elle n'est pas actuellement en cours d'exécution, il nous suffit de revenir à zéro.
De cette façon, je peux arrêter le travail si elle a été en cours d'exécution pour un montant de temps, au-delà d'un certain seuil.
Je suppose que la combinaison de xp_sqlagent_enum_jobs et sysjobhistory pourrait être utilisé, mais je suis curieux de savoir si il y a de meilleures solutions... et peut espérer bénéficier des obstacles que le reste d'entre vous avez déjà exécuté et a travaillé autour de.
OriginalL'auteur Kevin Fairchild | 2012-05-23
Vous devez vous connecter pour publier un commentaire.
Cette solution permettrait de travail:
Un contrôle général dépendante sur les tables système. Si vous préférez un itinéraire personnalisé, vous pouvez avoir le travail de l'insérer dans un journal de travail de table que vous avez créé à la place.
Pas nécessairement. Si vous êtes à la recherche d'un emploi qui est actuellement en cours d'exécution et en cours d'exécution plus long que prévu, cette requête ne doit renvoyer qu'à vous de ce qui est actuellement en cours d'exécution. Si elle n'est pas en cours d'exécution, il ne retourne rien.
Dans la pratique, les résultats obtenus sur un travail qui est actuellement en cours d'exécution, de fait, donne un tas de documents. Limiter avec qui rejoignent semble donner les valeurs correctes. J'ai modifié votre réponse et accepté.
C'est qu'en raison du problème que vous avez mentionné avant, où le travail se bloque et vous devez arrêter manuellement? Je suis curieux de savoir ce que les extra retourné entrées sont. Si il y a des extra retourné entrées, la requête s'exécute également sur la question de la restitution de la différence entre le moment où le dernier emploi accroché même si le travail n'est pas en cours d'exécution. Je vais modifier la requête un peu comme la jointure peut être remplacé par un top 1.
Zhenny, en utilisant le nouveau code, j'obtiens des résultats comme de la "11" ou "12" alors qu'il est en cours d'exécution, puis les résultats comme "22916011" pour le reste du temps. Dès que le travail commence de nouveau, il remonte à simple et double-chiffres. Lorsque la JOINTURE était là, je n'étais pas en arriver à ces résultats. J'aimerais voir le nombre de secondes pendant qu'il était en cours d'exécution ou pas de résultat.
OriginalL'auteur Zhenny
OriginalL'auteur Bikash
Ce que vous faites manuellement sons comme ce qui est connu comme un "chien de garde" en boucle. Fondamentalement, un travail SQL qui commence et/ou assure le suivi des travaux de l'agent, de les tuer en cas de besoin.
Le code ci-dessous a été prise à partir d'ici, et devrait permettre, en supprimant la nécessité pour vous de surveiller manuellement et supprimer des emplois si elles l'ont été en cours d'exécution pendant une longue période de temps:
OriginalL'auteur Free Coder 24