sql

Amaury a marqué ce sujet comme résolu.

bonjour, j’ai fais une requête pour l’historique de traitement de mes jobs et je veux introduire dans ma requête pour avoir une clé unique pour identifier les étapes traitées le même jour pour un job
voici ma requête

SELECT 
    J.name AS nomJob,
    CONVERT(sysname, SUSER_SNAME(j.owner_sid)) as proprietaire, 
    S.step_id AS numeroEtapeJob,
    S.step_name AS nomEtapeJob, 
    CONVERT(VARCHAR(19), CONCAT(CONVERT(date,convert(varchar(10), H.run_date, 103)), ' ', 
	CONVERT(VARCHAR(8), CAST(STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), H.run_time), 6), 5, 0, ':'), 3, 0, ':') AS TIME), 108))) AS Date_Execution_Etape,
    CASE LEN(CAST(H.run_duration AS VARCHAR(10)))  
        WHEN 1 THEN '00:00:0' + CAST(H.run_duration AS CHAR(1))  
        WHEN 2 THEN '00:00:' + CAST(H.run_duration AS CHAR(2))  
        WHEN 3 THEN '00:0' + STUFF(CAST(H.run_duration AS CHAR(3)), 2, 0, ':')  
        WHEN 4 THEN '00:' + STUFF(CAST(H.run_duration AS CHAR(4)), 3, 0, ':')  
        WHEN 5 THEN '0' + STUFF(STUFF(CAST(H.run_duration AS CHAR(5)), 2, 0, ':'), 5, 0, ':')  
        WHEN 6 THEN STUFF(STUFF(CAST(H.run_duration AS CHAR(6)), 3, 0, ':'), 6, 0, ':')  
    END AS dureeExecutionEtape,
    CASE H.run_status
        WHEN 0 THEN 'échec'
        WHEN 1 THEN 'Succés'
        WHEN 2 THEN 'A reprendre'
        WHEN 3 THEN 'annulé'
        WHEN 4 THEN 'en cours'
    END AS 'EtatDexecution'
FROM msdb.dbo.sysjobs AS J  
INNER JOIN msdb.dbo.sysjobsteps AS S  
    ON J.job_id = S.job_id  
INNER JOIN msdb.dbo.sysjobhistory AS H  
    ON S.job_id = H.job_id  
    AND S.step_id = H.step_id 

ORDER BY Date_Execution_Etape DESC

Pourrais vous m’aider svp

+0 -0

Bonjour, Il faudrait nous aiguiller un peu plus.

Si j’ai bien compris, tu voudrais présenter les résultats selon un ordre particulier. Cette ordre c’est: Arrangé par JOUR, classé par nomJob dans l’ordre anti-chronologique ?

J’ai bon ? Si oui, tu devrais t’en sortir avec uniquement en modifiant le ORDER BY comme ceci :

ORDER BY Date(Date_Execution_Etape) DESC, nomJob, Date_Execution_Etape DESC

Si je m’en tiens à ce que tu dis, tu veux juste rajouter un id mais j’ai l’impression que c’est redondant avec nomJob non ?

+1 -0

Bonjour Mari,

Si tu as la réponse à ta demande, merci de mettre ton sujet à "Résolu". Ça aiderait si quelqu’un aurait besoin d’un conseil identique, et chercherait sur le forum.

Merci d’avance.

PS: C’est vrai que Ache, il est vachement fort!

+1 -0

Ok …

C’est quoi le problème, ça te retourne quoi comme erreur ? C’est quoi le comportement ?

Sans info, nous on peut rien faire.

+0 -0

Oui Ache En fait je veux une clé de traitement qui identifiera pour un job donné le traitement de ces étapes cela veut dire que si plusieurs étapes s’exécutent le même jour Alors cette clé me permettra de savoir que ces étapes on été traités le même jour J’ai regardé les tables système mais ne n’arrive pas à trouver Merci

J’ai cherché un peu et il semble que tu utilises Microsoft SQL Server. Hors, je t’ai donné une commande pour My SQL. Donc Date(Date_Execution_Etape) devrait être CAST(Date_Execution_Etape AS Date).

Essaye

SELECT 
    J.name AS nomJob,
    CONVERT(sysname, SUSER_SNAME(j.owner_sid)) as proprietaire, 
    S.step_id AS numeroEtapeJob,
    S.step_name AS nomEtapeJob, 
    CONVERT(VARCHAR(19), CONCAT(CONVERT(date,convert(varchar(10), H.run_date, 103)), ' ', 
	CONVERT(VARCHAR(8), CAST(STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), H.run_time), 6), 5, 0, ':'), 3, 0, ':') AS TIME), 108))) AS Date_Execution_Etape,
    CASE LEN(CAST(H.run_duration AS VARCHAR(10)))  
        WHEN 1 THEN '00:00:0' + CAST(H.run_duration AS CHAR(1))  
        WHEN 2 THEN '00:00:' + CAST(H.run_duration AS CHAR(2))  
        WHEN 3 THEN '00:0' + STUFF(CAST(H.run_duration AS CHAR(3)), 2, 0, ':')  
        WHEN 4 THEN '00:' + STUFF(CAST(H.run_duration AS CHAR(4)), 3, 0, ':')  
        WHEN 5 THEN '0' + STUFF(STUFF(CAST(H.run_duration AS CHAR(5)), 2, 0, ':'), 5, 0, ':')  
        WHEN 6 THEN STUFF(STUFF(CAST(H.run_duration AS CHAR(6)), 3, 0, ':'), 6, 0, ':')  
    END AS dureeExecutionEtape,
    CASE H.run_status
        WHEN 0 THEN 'échec'
        WHEN 1 THEN 'Succés'
        WHEN 2 THEN 'A reprendre'
        WHEN 3 THEN 'annulé'
        WHEN 4 THEN 'en cours'
    END AS 'EtatDexecution'
FROM msdb.dbo.sysjobs AS J  
INNER JOIN msdb.dbo.sysjobsteps AS S  
    ON J.job_id = S.job_id  
INNER JOIN msdb.dbo.sysjobhistory AS H  
    ON S.job_id = H.job_id  
    AND S.step_id = H.step_id 
ORDER BY CAST(Date_Execution_Etape AS Date) DESC, nomJob, Date_Execution_Etape DESC

Je n’ai pas de Microsoft SQL Server donc je ne peux pas vraiment tester mais l’idée c’est de prendre la date d’exécution (exemple 2023-05-03 18:02:03+02:00) et de ne garder que l’information de la journée (2023-05-03).

Sinon, tu devras l’ajouter toi même avec un nouveau champ. :S
Je sais pas quelles sont tes possibilités à ce niveau là.

+0 -0

C’est vrai @mari que tes explications me laissent encore un peu dans le flou.
Ma boule magique a des limites. 🧙 🔮 (Ne le prend pas mal Mari, c’est une blague sur une prétendue boule magique que j’aurais pour deviner les problèmes des gens).

Quand tu dis:

En fait je veux une clé de traitement qui identifiera pour un job donné le traitement de ces étapes cela veut dire que si plusieurs étapes s’exécutent le même jour, alors cette clé me permettra de savoir que ces étapes on été traités le même jour

Tu veux quoi au juste ? La date du jour ça te permet de savoir que les étapes on été le même jour non ?

Car tu parles d’une clé de traitement, c’est quoi pour toi ? Une valeur SQL ?

Quand je dis ça:

la date d’exécution (exemple 2023–05–03 18:02:03+02:00) et de ne garder que l’information de la journée (2023–05–03).

Tu comprends la stratégie que j’adopte ?

+0 -0

Je vois que je n’avais pas bien expliqué Voici ce que je veux ajouter à ma requête le min de instance_id et le max de instance_id de chaque traitement(cela veux dire que le max est égal à l’instance id dont le numéro de l’étape est égal à 0 et le min est égal à l’instance id dont le numéro de l’étape est suivi par 0) et si par exemple j’ai un job dont plusieurs de ces étapes ont été exécutés le même jour cela veut dire que dans la colonne min j’aurais la même valeur pour toutes ces étapes et même chose que min J’ai essayé d’utiliser la clause partition by mais je n’y arrive pas Voici l’exemple que j’ai essayé d’utiliser mais je n’arrive pas à inclure les conditions que je veux requetye select object_id, type , [min] = min(object_id) over(partition by type) , [max] = max(object_id) over(partition by type) from sys.objects

Merci pour votre aide !

+0 -0

Tu dis : je veux le min de instance_id de chaque traitement.

Ok, donc on devrait avoir quelquepart : min(instance_id) et plus loin : group by traitement

Mais problème, tu parles de 'traitement’, et nulle part, on ne voit de variable traitement ou id_traitement

A la fin de ton dernier message, tu écris 'partition by type' Donc peut-être que ce que tu appelles 'type' ça correspond à ce que tu appelles traitement au début du message. Mais bof, ça n’a pas l’air ça non plus. En regardant la doc SQLServer sur ces tables système, je pense que ce que tu appelles traitement, ça correspond à un JOB_ID. Mais pas sûr.

Je pense qu’il faut que tu avances étape par étape.

As-tu une requête qui fonctionne : elle donne un résultat correct, mais incomplet. Par exemple une requête qui renvoie 100 lignes, et toi, tu veux résumer ces 100 lignes en 15 lignes.

Si oui, tu postes cette requête, et tu essaies de décrire au mieux ce que tu veux changer.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte