IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Réupérer la date d'une exécution


Sujet :

Développement SQL Server

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Oui, vous pouvez écrire une fonction pour cela :

    [/code]

    Un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.FnGetLastSuccessfulJobExecution('TOTO')
    @++
    Bonjour elsuket

    J'ai utilisé cette fonction et je l'ai mis dans une procédure stockée. voici le code :
    j'ai remplaçé à 2 places @nomJob par @TOTO car ma job s'appelle TOTO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    CREATE PROCEDURE PROC_1 AS
    CREATE FUNCTION FnGetLastSuccessfulJobExecution
     (@TOTO SYSNAME)
     RETURNS DATETIME
    AS
    BEGIN
     RETURN
     (
      SELECT DateTimeExec + 1
      FROM
      (
       SELECT MAX(CAST(STUFF(STUFF(DateExec, 12, 0, ':'), 15, 0, ':') AS DATETIME)) AS DateTimeExec
       FROM
       (
        SELECT CAST(H.run_date AS CHAR(8)) + ' ' +
          CASE LEN(CAST(H.run_time AS VARCHAR(6)))
           WHEN 5 THEN '0' + CAST(H.run_time AS CHAR(5))
           ELSE CAST(H.run_time AS CHAR(6))
          END AS DateExec
        FROM msdb.dbo.sysjobs AS J
        JOIN msdb.dbo.sysjobhistory AS H
         ON J.job_id = H.job_id
        WHERE J.name = @TOTO
        AND H.run_status = 1
        AND H.step_id = 1
       ) AS EXEC_JOB_TEST
      ) AS DER_EXEC_JOB_TEST_OK
     )
    END
    SELECT dbo.FnGetLastSuccessfulJobExecution('TOTO')
    Voici les erreurs que ca me donne :
    Error 156: Incorrect syntax near the keyword 'FUNCTION'
    MUST declare the variable '@TOTO'.
    The name 'FnGetLastSuccessfulJobExecution' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted

  2. #22
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    En effet, vous ne pouvez pas écrire un code tel que celui-ci : vous ne pouvez pas créer une fonction dans une procédure stockée comme vous le faites.

    C'est une possibilité si vous devez générer du code, mais vous devez pour cela exécuter du code SQL dynamique, c'est-à-dire construire votre chaîne de requête que vous stockez dans une variable de type chaîne de caractère et que vous exécutez ensuite à l'aide de l'ordre EXEC, mais je ne crois pas que ce soit ce dont vous avez besoin.

    En T-SQL, tout mot précédé par un arobase est une variable, pas un chaîne de caractères. Par exemple, on peut tout à fait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @TOTO CHAR(4)
    SET @TOTO = 'toto'
    SELECT @TOTO
    mais aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @TOTO VARCHAR(20)
    SET @TOTO = 'Bonjour DEV-10'
    SELECT @TOTO
    La seule différence entre ces deux bouts de code est que dans le premier la variable @TOTO prend la valeur 'toto', et dans la seconde, 'Bonjour DEV-10'.

    On pourrait d'ailleurs écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE @TOTO VARCHAR(20)
     
    SET @TOTO = 'toto'
    SELECT @TOTO
     
    SET @TOTO = 'Bonjour DEV-10'
    SELECT @TOTO
    Ensuite je ne sais pas quel est exactement votre besoin, donc je ne sais pas si vous avez besoin de la fonction ou de la procédure stockée.
    Notez que dans la procédure stockée, vous pouvez lever des exceptions, ce qui est impossible dans une fonction.
    Mais vous pouvez aussi faire appel à la fonction dans une procédure stockée.

    Quelques exemples pour vous éclairer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE PROCEDURE PROC_1
    	@nomJob SYSNAME
    AS
    BEGIN
    	DECLARE @dateDerniereExecutionOK DATETIME
     
    	IF EXISTS
    	(
    		SELECT *
    		FROM msdb.dbo.sysjobs
    		WHERE name = @nomJob
    	)
    	BEGIN
    		-- Recherche de la dernière date d'exéuction correcte du job
    		SELECT @dateDerniereExecutionOK = dbo.FnGetLastSuccessfulJobExecution(@nomJob)
     
    		-- Possibilité : on retourne cette date
    		SELECT @dateDerniereExecutionOK
    	END
    	ELSE -- Le job n'existe pas, on lève une erreur
    	BEGIN
    		RAISERROR('Le job de nom %s n''existe pas', 16, 1, @nomJob)
    	END
    END
    Exemple d'utilisation :

    Sur ma machine, cela affiche :

    2009-05-08 20:00:02.366
    Autre exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE PROCEDURE PROC_1
    	@nomJob SYSNAME
    AS
    BEGIN
    	DECLARE @dateDerniereExecutionOK DATETIME
     
    	IF EXISTS
    	(
    		SELECT *
    		FROM msdb.dbo.sysjobs
    		WHERE name = @nomJob
    	)
    	BEGIN
    		-- Recherche de la dernière date d'exéuction correcte du job
    		SELECT @dateDerniereExecutionOK = dbo.FnGetLastSuccessfulJobExecution(@nomJob)
     
    		-- Autre possibilité
    		SELECT @nomJob AS nomJob,
    				@dateDerniereExecutionOK AS lastSuccessfulJobExecution
    	END
    	ELSE -- Le job n'existe pas, on lève une erreur
    	BEGIN
    		RAISERROR('Le job de nom %s n''existe pas', 16, 1, @nomJob)
    	END
    Ces deux exemples font appel à la fonction.
    Il sera avantageux de conserver la fonction si vous allez exécuter le même code dans plusieurs procédures stockées par exemple, ou référencer la fonction dans la définition d'une vue ...
    Sinon, utilisez une procédure stockée qui comprend le code de la fonction.
    Mais qu'allez-vous en faire ensuite ? l'exploiter dans une application ?

    Voici deux exemples de procédures qui comprennent le code de la fonction que je vous ai proposée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    CREATE PROCEDURE PROC_3
    	@nomJob SYSNAME
    AS
    BEGIN
    	-- Pour ne pas retourner le nombre de lignes affectées à l'application cliente
    	SET NOCOUNT ON
     
    	-- Contrôle basique de la validité du nom du job
    	IF @nomJob IS NULL OR LEN(@nomJob) = 0
    	BEGIN
    		RAISERROR('Le nom du job doit être correctement renseigné', 16, 1)
    	END
     
    	-- Test de l'existence du job dont le nom a été passé en paramètre
    	IF EXISTS
    	(
    		SELECT *
    		FROM msdb.dbo.sysjobs
    		WHERE name = @nomJob
    	)
    	BEGIN
    		DECLARE @dateDerniereExecutionOK DATETIME
     
    		-- Recherche de la dernière date d'exécution correte du job
    		SELECT @dateDerniereExecutionOK = DateTimeExec + 1
    		FROM
    		(
    			SELECT MAX(CAST(STUFF(STUFF(DateExec, 12, 0, ':'), 15, 0, ':') AS DATETIME)) AS DateTimeExec
    			FROM
    			(
    				SELECT CAST(H.run_date AS CHAR(8)) + ' ' +
    						CASE LEN(CAST(H.run_time AS VARCHAR(6)))
    							WHEN 5 THEN '0' + CAST(H.run_time AS CHAR(5))
    							ELSE CAST(H.run_time AS CHAR(6))
    						END AS DateExec
    				FROM msdb.dbo.sysjobs AS J
    				JOIN msdb.dbo.sysjobhistory AS H
    					ON J.job_id = H.job_id
    				WHERE J.name = @nomJob
    				AND H.run_status = 1
    				AND H.step_id = 1
    			) AS EXEC_JOB_TEST
    		) AS DER_EXEC_JOB_TEST_OK
     
    		-- Retourne la date trouvée
    		SELECT @dateDerniereExecutionOK
    	END
    	ELSE -- Le job n'existe pas, on lève une erreur
    	BEGIN
    		RAISERROR('Le job de nom %s n''existe pas', 16, 1, @nomJob)
    	END
    END
    L'instruction RAISERROR vous permet de lever une erreur tout en spécifiant votre message.
    Dans le dernier RAISERROR de cette procédure, j'ai utilisé %s : cela permet, similairement au langage C, de remplacer %s par la valeur du paramètre @nomJob lors de la levée de l'exception.
    Le niveau 16 indique que c'est une erreur que le développeur peut corriger.
    Le 1 est une valeur que vous choisissez et qui permet, par exemple, de vous repérer dans votre code si vous levez plusieurs fois une erreur avec le même libellé.

    La méthode d'appel est la même que précédemment :

    et affiche, de la même manière, dans SQL Server Management Studio :

    2009-05-08 20:00:02.366
    Voici un dernier exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    CREATE PROCEDURE PROC_4
    	@nomJob SYSNAME,
    	@dateDerniereExecutionOK DATETIME = NULL OUTPUT
    AS
    BEGIN
    	-- Pour ne pas retourner le nombre de lignes affectées à l'application cliente
    	SET NOCOUNT ON
     
    	-- Contrôle basique de la validité du nom du job
    	IF @nomJob IS NULL OR LEN(@nomJob) = 0
    	BEGIN
    		RAISERROR('Le nom du job doit être correctement renseigné', 16, 1)
    	END
     
    	-- Test de l'existence du job dont le nom a été passé en paramètre
    	IF EXISTS
    	(
    		SELECT *
    		FROM msdb.dbo.sysjobs
    		WHERE name = @nomJob
    	)
    	BEGIN
    		-- Recherche de la dernière date d'exécution correcte du job
    		SELECT @dateDerniereExecutionOK = DateTimeExec + 1
    		FROM
    		(
    			SELECT MAX(CAST(STUFF(STUFF(DateExec, 12, 0, ':'), 15, 0, ':') AS DATETIME)) AS DateTimeExec
    			FROM
    			(
    				SELECT CAST(H.run_date AS CHAR(8)) + ' ' +
    						CASE LEN(CAST(H.run_time AS VARCHAR(6)))
    							WHEN 5 THEN '0' + CAST(H.run_time AS CHAR(5))
    							ELSE CAST(H.run_time AS CHAR(6))
    						END AS DateExec
    				FROM msdb.dbo.sysjobs AS J
    				JOIN msdb.dbo.sysjobhistory AS H
    					ON J.job_id = H.job_id
    				WHERE J.name = @nomJob
    				AND H.run_status = 1
    				AND H.step_id = 1
    			) AS EXEC_JOB_TEST
    		) AS DER_EXEC_JOB_TEST_OK
    	END
    	ELSE -- Le job n'existe pas, on lève une erreur
    	BEGIN
    		RAISERROR('Le job de nom %s n''existe pas', 16, 1, @nomJob)
    	END
    END
    Le code est assez similaire à celui de PROC_3, mais nous retournons à l'appelant la date que nous cherchons dans une variable.
    Dès lors l'utilisation est différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @monJob SYSNAME,
    		@quandLeJobSEstIlCorrectementExecutePourLaDernireFois DATETIME
     
    SET @monJob = 'TOTO'
     
    EXEC dbo.PROC_4
    		@nomJob = @monJob,
    		@dateDerniereExecutionOK = @quandLeJobSEstIlCorrectementExecutePourLaDernireFois OUTPUT
     
    SELECT @quandLeJobSEstIlCorrectementExecutePourLaDernireFois
    Et cela affiche toujours :

    2009-05-08 20:00:02.366
    Vous voyez donc que les possibilités sont nombreuses.
    Si tout cela est obscur, n'hésitez pas à reposter en précisant votre besoin.

    @++

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    C'est beaucoup plus clair maintenant.

    J'ai essayé la PROC_3 et elle me donne :
    2009-08-06 15:58:01.000
    alors que ici on est encore le 05 Aout. Aussi ca me donne la même heure à chaque fois. Il me semble que c'est la même variable qui s'imprime comme une constante.

    Comment ca se fait qu'elle te done le 05 Aout sur ta machine.

    J'ai aussi remarqué que même sur ta machine pour les 3 exemples tu avais la même heure.

    2009-05-08 20:00:02.366
    2009-05-08 20:00:02.366
    2009-05-08 20:00:02.366

  4. #24
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    J'ai essayé la PROC_3 et elle me donne :
    2009-08-06 15:58:01.000
    alors que ici on est encore le 05 Aout. Aussi ca me donne la même heure à chaque fois. Il me semble que c'est la même variable qui s'imprime comme une constante.
    C'est normal : cela donne la date de dernière bonne exécution du job + un jour, ce que vous avez demandé dans votre premier post :

    J'aimerai rajouter une condition au code de cette procédure stockée pour qu'elle tourne en prenant compte de la date de la dernière bonne exécution + 1 jour.
    Je vous ai donc proposé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @NouvelleDateExec = DateTimeExec + 1
    C'est à dire que dans toutes les propositions que je vous ai faites par la suite, j'ai ajouté un jour à la date la plus récente de bonne exécution d'un job.

    Comment ca se fait qu'elle te done le 05 Aout sur ta machine.
    Nous n'avons pas la même instance SQL Server
    J'ai créé un job de nom TOTO sur l'instance SQL Server avant-hier soir chez moi, donc il est normal que j'aie une date au 5 Août

    J'ai aussi remarqué que même sur ta machine pour les 3 exemples tu avais la même heure.
    C'est normal puisque j'ai exécuté le job plusieurs fois le 4 Août (notamment en le faisant planter) : la date de dernière bonne exécution est donc au 4 Août.
    Dans le code nous ajoutons 1 jour à la date de dernière bonne exécution, donc nous obtenons le 5 Août

    @++

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Ok tout est correct, j'ai enlevé le '+1' et ca me donne la date de la dernière bonne exécution.

    J'ai supprimer une table pour provoquer un "Failed" et ca marche toujours. ca me donne l'avant dernière exécution. Super !

    Lorsqu'un un "Failed", quelles ont toutes les places où il faut aller regarder pour connaitre le détail sur l'erreur qui a causée le "Failed"

    Est-ce seulement le "event log' ? si oui dans quel menu exactement dans SQL Server ?

    Je suis débutant avec SQL SERVER

    Exemple : à quelle place je vais regarder pour découvrir que la table X n'a pas été trouvée ?

    Merci.

  6. #26
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    J'ai supprimer une table pour provoquer un "Failed" et ca marche toujours. ca me donne l'avant dernière exécution. Super !
    OK, mais vous auriez pu tout simplement mettre tout le code de votre job ou de la procédure que vous appelez en commentaire et mettre un RAISERROR à la place

    Lorsqu'un un "Failed", quelles ont toutes les places où il faut aller regarder pour connaitre le détail sur l'erreur qui a causée le "Failed"
    Comme dans la requête que je vous ai proposé, il vous suffit de requêter la table système msdb.dbo.sysjobhistory.
    La colonne run_status prend la valeur 0 en cas d'échec du job

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT CAST(H.run_date AS CHAR(8)) + ' ' +
    		CASE LEN(CAST(H.run_time AS VARCHAR(6)))
    			WHEN 5 THEN '0' + CAST(H.run_time AS CHAR(5))
    			ELSE CAST(H.run_time AS CHAR(6))
    		END AS DateExec,
    		H.message
    FROM msdb.dbo.sysjobs AS J
    JOIN msdb.dbo.sysjobhistory AS H
    	ON J.job_id = H.job_id
    WHERE J.name = @nomJob
    AND H.run_status = 0
    Les messages de bonne exécution ou d'erreurs sont stockés dans la colonne message de la table msdb.dbo.sysjobhistory

    Est-ce seulement le "event log' ? si oui dans quel menu exactement dans SQL Server ?
    Quand vous parlez d'Event Log, vous entendez l'observateur d'événements de Windows ?
    Si tel est le cas je ne crois pas que les erreurs de jobs soient inscrites dans ce journal.

    Pour voir l'historique des exécutions de job dans Enterprise Manager :
    - Développez un groupe de serveurs, puis développez un serveur.
    - Développez Gestion, puis Agent SQL Server, et cliquez sur Travaux.
    - Dans le volet de détails, cliquez avec le bouton droit sur un travail, puis cliquez sur Afficher l'historique du travail

    Notez que cette manipulation est décrite dans la documentation de SQL Server 2000 (Recherchez : Modification et affichage des travaux)
    que je vous invite à télécharger depuis le lien dans ma signature

    @++

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par elsuket Voir le message
    il vous suffit de requêter la table système msdb.dbo.sysjobhistory.
    La colonne run_status prend la valeur 0 en cas d'échec du job
    J'ai exécuté ce select sur ma machine et il me donne la valeur de 1 dans toute la colonne run_status , alors que ma job a échouer à plusieurs reprises.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select run_date, run_duration, run_status from msdb.dbo.sysjobhistory where run_date = '20090806'
    Mais il y a une chose que je ne comprend pas, quelle colonne détermine exactement le nom ou le numéro de ma job plus précisément ? car je ne vois pas le nom de ma job dans le contenu de la table.

  8. #28
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    C'est normal, nous avons filtré sur la table msdb.dbo.sysjobs, qui elle, contient le nom du job.
    C'est la jointure sur la colonne job_id de ces deux tables qui permet d'obtenir l'ensemble de données dont nous avons besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FROM msdb.dbo.sysjobs AS J
    JOIN msdb.dbo.sysjobhistory AS H
    	ON J.job_id = H.job_id
    WHERE J.name = @nomJob
    La colonne job_id est clé primaire de la table msdb.dbo.sysjobs, et clé étrangère dans msdb.dbo.sysjobhistory

    Pour un cours sur les jointures, je vous invite à regarder l'article de SQLPro à ce sujet
    Quelques exemples simples sont aussi disponibles ici

    @++

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    IF ....
    BEGIN
    RAISERROR('La table X n''existe pas', 16, 1)
    END
    Salut Elsuket

    Une question pour le RAISERROR.

    Moi je vais mettre tout mon travail dans une procédure stockée, et cette procédure stockée va être appelée par une night job sur le serveur SQL.
    Je n'aurais pas d'application qui y sera reliée.

    Dans ce cas, si à un moment donné la job échoue, à quelle place je vais y aller pour voir ce que le RAISERROR avait affiché ? je suis allé voir la colonne "message" de la table sysjobhistory et elle ne contient pas tout le contenu du RAISERROR dans le cas d'un echec de la job.

    Est-ce que le "PRINT" et "RETURN" est une bonne méthode pour afficher et sortir de la procédure si un problème survient ?

    Merci.

  10. #30
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Dans Enterprise Manager, faites un clic-droit sur le job, et choisissez Propriétés.
    Rendez-vous dans l'onglet Etapes, et choisissez Modifier ou Editer.
    Passez dans l'onglet Avancé, et dans la section "Options de la commande de script Transact-SQL", spécifiez un fichier de sortie.
    Toute sortie texte de votre job sera enregistrée dans ce fichier.

    Voici ce que cela donne dans l'historique pour un job nommé TEST que j'ai fait planter en mettant comme commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RAISERROR('Test d''erreur', 16, 1)


    En regardant les étapes, nous obtenons :



    Voyons ce que donne notre requête :



    Voyons le fichier de sortie, après avoir choisi l'onglet Etapes, Modifier ou Editer, puis l'onglet Avancé





    Ainsi lorsqu'une exception sera levée à l'exécution de votre job, ou pour toute commande PRINT que vous aurez spécifiée dans la requête à faire exécuter par le job, vous retrouverez le libellé dans ce fichier.

    Si un jour vous faites un job de sauvegarde de base de données, et que vous spécifiez un fichier de sortie, vous aurez la sortie que vous avez d'habitude dans l'Analyseur de requêtes dans le fichier de sortie.

    @++

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut [RÉSOLU]
    Citation Envoyé par elsuket Voir le message
    Dans Enterprise Manager, faites un clic-droit sur le job, et choisissez Propriétés.
    Rendez-vous dans l'onglet Etapes, et choisissez Modifier ou Editer.
    Passez dans l'onglet Avancé, et dans la section "Options de la commande de script Transact-SQL", spécifiez un fichier de sortie.
    Toute sortie texte de votre job sera enregistrée dans ce fichier.

    Voici ce que cela donne dans l'historique pour un job nommé TEST que j'ai fait planter en mettant comme commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RAISERROR('Test d''erreur', 16, 1)


    En regardant les étapes, nous obtenons :



    Voyons ce que donne notre requête :



    Voyons le fichier de sortie, après avoir choisi l'onglet Etapes, Modifier ou Editer, puis l'onglet Avancé





    Ainsi lorsqu'une exception sera levée à l'exécution de votre job, ou pour toute commande PRINT que vous aurez spécifiée dans la requête à faire exécuter par le job, vous retrouverez le libellé dans ce fichier.

    Si un jour vous faites un job de sauvegarde de base de données, et que vous spécifiez un fichier de sortie, vous aurez la sortie que vous avez d'habitude dans l'Analyseur de requêtes dans le fichier de sortie.

    @++
    Parfait !!

    Merci beaucoup Elsuket

    J'ai posté ici pour les curseurs et je n'ai pas encore des réponses qui répondent à mon besoin. Faut-il changer le Forum ?

    J'ai rajouté [RÉSOLU] en haut.

  12. #32
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    J'ai posté ici pour les curseurs et je n'ai pas encore des réponses qui répondent à mon besoin. Faut-il changer le Forum ?
    Non

    Dans tous les cas, évitez les curseurs

    J'ai rajouté [RÉSOLU] en haut.
    Il y a un bouton en bas de la page pour marquer le sujet tel que

    @++

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Non

    Dans tous les cas, évitez les curseurs


    Il y a un bouton en bas de la page pour marquer le sujet tel que

    @++
    J'ai utilisé les curseurs parce que apparamment il n'y a pas de tableaux dynamiques à deux dimensions dans SQL.

    Est-ce que tu as une autre idée meilleur que les curseurs pour ce thype de traitement ?

    je n'ai pas de colonne "identity" dans mes 2 tables.

    Voici mon algorithme : table_1 et table_2

    <B><B>
    Lire première ligne de la table_1
    Lire premiere ligne de la table_2
    Traitement
    Lire deuxième ligne de la table_2
    Traitement
    Lire troisième ligne de la table_2
    Traitement
    Lire quatrième ligne de la table_2
    ................
    ................
    Lire dernière ligne de la table_2
    Lire deuxième ligne de la table_1
    Lire premiere ligne de la table_2
    Traitement
    Lire deuxième ligne de la table_2
    Traitement
    Lire troisième ligne de la table_2
    Traitement
    Lire quatrième ligne de la table_2
    ................
    ................
    Lire dernière ligne de la table_2
    .
    .
    .
    .
    Lire dernière ligne de la table_1
    Lire premiere ligne de la table_2
    Traitement
    Lire deuxième ligne de la table_2
    Traitement
    Lire troisième ligne de la table_2
    Traitement
    Lire quatrième ligne de la table_2
    ................
    ................
    Lire dernière ligne de la table_2
    </B>
    </B>

  14. #34
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Le langage SQL est conçu pour traiter un ensemble de données, c'est à dire qu'au sens mathématique, on traite des tuples.
    Lorsqu'on écrit du code SQL, on doit oublier toute logique itérative, comme celle induite par les curseurs, les boucles WHILE, ...
    Ce sont des instruments que l'on ne doit utiliser qu'en dernier recours, quand on a exploré toutes les autres possibilités (et elles sont nombreuses !)

    Si tu veux éviter ce traitement par curseur, je t'invite à nous donner le code complet de ton curseur ainsi que des tables qui sont spécifiées dans celui-ci.
    Sans cela nous ne pourrons pas t'aider plus.

    @++

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. date d'une requete sql
    Par innosang dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/04/2004, 10h27
  2. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 15h25
  3. insérer une date dans une table mssql
    Par ericmart dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/01/2004, 11h37
  4. test la valeur d'une date dans une requete
    Par TuxP dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 15h53
  5. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo