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

MS SQL Server Discussion :

[SQL2K] Récupération Erreur lors d'un execute


Sujet :

MS SQL Server

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut [SQL2K] Récupération Erreur lors d'un execute
    Bonjour,

    Je crée des requêtes dynamique de mise à jour de données que j'execute dans un EXECUTE.

    En gros voici le principe :

    -- Via un curseur
    POUR CHAQUE DONNEES
    -1- Creation de la requete
    -2- EXECUTE(<MA_REQUETE>)


    Le tout est entouré d'une transaction et après chaque execute, je teste la valeur @@ERROR et so @@ERROR <> 0 ==> Via un GOTO je vais dans la partie rollback.

    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
     
    -- [...]
        -- Execute
        EXECUTE(@STR_1)
        -- Erreur ?
        IF @@ERROR<>0 
    	BEGIN
    		GOTO ROLLBACK_TRANSACTION
    	END
     
    -- [...]
    COMMIT_TRANSACTION:
      PRINT 'COMMIT DE LA TRANSACTION'
      COMMIT TRANSACTION
      GOTO END_TRANSACTION
    ROLLBACK_TRANSACTION:
      PRINT 'ANNULATION DE LA TRANSACTION'
      ROLLBACK TRANSACTION
      GOTO END_TRANSACTION
    END_TRANSACTION:
      CLOSE CUR_REQUETE
      DEALLOCATE CUR_REQUETE
    Quelqu'un aurait une idée ?

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    ton code est bon ...

    par contre, pense que ta variable @@error est réinitialisée au début de TOUTE requete, donc tu dois mettre ton test après CHAQUE execute

    A+

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Effectivement ton script SQL à l'air bon la gestion des erreurs ne me paraît pas mauvaise.

    Pourrais-tu donner plus de précision sur ton problème ?

    Nicolas L.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Le test est mis juste après CHAQUE execute ...

    Le problème est que dans mon EXECUTE j'ai plusieurs requêtes, pour l'exemple on va dire trois :
    A B C.
    A & C ne pose pas de problème.
    B ne respecte pas une contrainte d'intégrité ...

    Si je fais : EXECUTE( A B C) dans l'analyseur de requête. Je vois que A est bien passé, que B a bien générée une erreur et que C c'est bien passée.
    Mais à la fin @@ERROR contient 0 ... Je pense qu'il considère que la dernière requête c'est C qui a bien fonctionnée !

    Par contre, si je fais EXECUTE( A C B), j'ai bien le message d'erreur et @@ERROR est différent de 0.

    Je pense @@ERROR contient non pas la dernière instruction de ma PS mais des requêtes contenues dans EXECUTE.

    Ma question est donc : comment savoir que des requêtes fait via un EXECUTE n'ont pas fonctionné.

    PS : J'ai le test avec sp_executesql et j'ai le même problème !

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    si tu est mettre de ton code dans le exécute, après chaque instruction SQL, tu mets un raiserror.ex:

    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
     
    -- 1° instruction
    insert into ...
    if @@error<>0
      raiserror('insert 1 planté',16,1)
    else
      begin
        -- 2° instruction
        insert into ...
        if @@error<>0
          raiserror('insert 2 planté',16,1)
        else
          begin
            -- 3° instruction
            ....
          end
      end
    comme çà, lorsque tu fait le exec le raiserror sera remonté

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Effectivement j'ai pensé à cette solution ... je suis effectivement maître de mon code.

    Le souci est que cela passe par un réseau WAN (< 1Mbits) et que je suis entrain de minimiser le flux ... donc je ne peux pas ajouter de nouveaux éléments dans le text que j'envoie.

    PS : En fait, les requêtes sont générées par une appli, transférées sur le réseau puis exécutée par une PS ...

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Pour être plus clair voici un 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
     
    DECLARE @STR AS VARCHAR(8000)
     
    SET @STR = ' INSERT INTO T_A(UID, UID_B, UID_C) VALUES (newid(), ''C7C86B92-EA59-4E4C-B7A5-499F69799C8C'', ''AFB38D28-7EA3-43C6-92B8-83EB9BE71505'') '
    SET @STR = @STR + ' INSERT INTO T_A(UID, UID_B, UID_C) VALUES (newid(), ''C7C86B92-EA59-4E4C-B7A5-499F69799C8C'', ''E220B491-BBB2-44E4-9481-FA0157946A02'') '
    SET @STR = @STR + ' INSERT INTO T_A(UID, UID_B, UID_C) VALUES (newid(), ''E220B491-BBB2-44E4-9481-FA0157946A02'', ''C7C86B92-EA59-4E4C-B7A5-499F69799C8C'') '
    SET @STR = @STR + ' INSERT INTO T_A(UID, UID_B, UID_C) VALUES (newid(), ''9c96812e-6210-4a4f-af6f-7027fc0f229f'', ''AFB38D28-7EA3-43C6-92B8-83EB9BE71505'') '
    SET @STR = @STR + ' INSERT INTO T_A(UID, UID_B, UID_C) VALUES (newid(), ''9c96812e-6210-4a4f-af6f-7027fc0f229f'', ''E220B491-BBB2-44E4-9481-FA0157946A02'') '
    SET @STR = @STR + ' DELETE FROM T_A WHERE UID_B = ''9c96812e-6210-4a4f-af6f-7027fc0f229f'''
    SET @STR = @STR + ' DELETE FROM T_B WHERE UID = ''9c96812e-6210-4a4f-af6f-7027fc0f229f'''
     
     
    EXECUTE(@STR)
    PRINT @@ERROR
    Les deux premiers insert génèrent une erreur car ils ne respectent pas une contrainte d'unicité,
    Le troisième génère également une erreur car il ne respecte pas une FK,
    Les dernières requêtent sont OK.

    Le résultat du print est 0.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    A partir du moment où tu exécute ta procédure stockée, l'ensemble de traitement est exécuté par le moteur de base de données SQL Server.
    Donc tu ne passe plus par ton réseau. Tu peux donc tester tes requêtes les unes après les autres. Il n'y aura aucun transfert de flux entre la machine appelant l'exécution et le serveur SQL où s'exécute ta procédure stockée.
    Il te suffit de découper la chaine passer en paramètre.

    N'hésite pas à poster si tu veux plus d'explication.

    Cordialement,
    Nicolas L.

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 9
    Par défaut
    Bjr
    En fait j'ai le meme pb et j'aimerais vraiment avoir une solution. Car je n'arrive pas a recuper le code de l'erreur.Exemple
    J'ai la procedure suivante:

    create proc tesInsert
    as
    insert into cpteclthist(dateoperation) values('juin 1 2007 10:06A')
    if @@error <> 0
    begin
    raiserror('insert 1 planté',16,1)
    end

    Mais lorsque j'execute cette procedure ( exec testInsert ) j'obtiend plutot :Serveur : Msg 241, Niveau 16, État 1, Procédure tes, Ligne 3
    Erreur de syntaxe lors de la conversion d'une valeur datetime à partir d'une chaîne de caractères.

    Je voudrais bien savoir comment intercepter ce message d'erreur. En passant je bosse avec sqlserver 2000
    merci d'avance

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 9
    Par défaut Recuperartion d'une erreur lors d'un execute
    Bjr
    En fait j'ai le meme pb et j'aimerais vraiment avoir une solution. Car je n'arrive pas a recuper le code de l'erreur.Exemple
    J'ai la procedure suivante:

    create proc tesInsert
    as
    insert into cpteclthist(dateoperation) values('juin 1 2007 10:06A')
    if @@error <> 0
    begin
    raiserror('insert 1 planté',16,1)
    end

    Mais lorsque j'execute cette procedure ( exec testInsert ) j'obtiend plutot :Serveur : Msg 241, Niveau 16, État 1, Procédure tes, Ligne 3
    Erreur de syntaxe lors de la conversion d'une valeur datetime à partir d'une chaîne de caractères.

    Je voudrais bien savoir comment intercepter ce message d'erreur. En passant je bosse avec sqlserver 2000
    merci d'avance

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Citation Envoyé par Madinico
    A partir du moment où tu exécute ta procédure stockée, l'ensemble de traitement est exécuté par le moteur de base de données SQL Server.
    Donc tu ne passe plus par ton réseau. Tu peux donc tester tes requêtes les unes après les autres. Il n'y aura aucun transfert de flux entre la machine appelant l'exécution et le serveur SQL où s'exécute ta procédure stockée.
    Je suis désolé mais j'ai pas du être clair ...

    En fait, mon prog envoie directement (via la reseau ) dans une même chaine plusieurs requêtes.

    Un exemple : J'ai 10 000 Insert à faire. Je le regroupe par 100 dans des chaînes de charactères que j'enregistre dans un table temporaire. Une fois les 100 paquets enregistrés, j'appele une PS qui va boucler sur les différents parquets et pour chaque directement appeler EXECUTE.

    Donc pour ajouter le texte de contrôle, il faut que le fasse au moment de la création des paquets ce qui va augmenter mon flux ...

    Mais j'ai l'impression que mon problème est insoluble ...

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Citation Envoyé par hypoass
    Bjr
    insert into cpteclthist(dateoperation) values('juin 1 2007 10:06A')
    T'as essayé de changer la forme de ta date ? '01/06/2007 10:06'.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 46
    Par défaut Re
    Bonjour,
    Une solution serait peut-être de passer par une table "JOURNAL" dans laquelle tu enregistrerait les messages d'erreur en temps réel à la place d'un raiserror...

    Pour les dates essaies de les mettre au format yyyy-mm-ddThh:mm:ss (le T n'est pas une faute de frappe). Avec ce format, tu n'as plus de pb de localisation...

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Je ne comprends pas trop le principe dans la table JOURNAL ... Car ca la va également ma générer du flux supplémentaire ?

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 46
    Par défaut Re
    Je ne pense pas.
    Le pb de @@ERROR c'est qu'il n'est pas persistant, il faut "l'utiliser" tout de suite.
    Tu crée une table JOURNAL (ou autre) dans laquelle tu vas stocker le message au moment même où il arrive.
    A la fin de ton block tu fais un select sur cette table.
    Le traffic sera proportionnel aux erreurs que tu auras eu (pas plus je pense que plusieurs raiserror)

  16. #16
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Ok je vois mieux !

    En fait, comme j'enregistre les flux, il faudrait que dans mon flux je mette également l'enregistrement dans la table journal ... donc mon flux augmenterait ...

  17. #17
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 285
    Par défaut
    Je crois que c'est bon j'ai trouvé !

    Il faut mettre la commence XACT_ABORT a ON. D'apres la doc, cela coupe toute transaction en cours dès la première erreur !

    J'ai fait plusieurs tests et il semble que cela resolve mon problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] erreur lors de l'execution
    Par jadoo dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2006, 20h37
  2. [3.2] Erreur lors de l execution
    Par magnus2005 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 28/07/2006, 10h33
  3. erreur lors de l'execution d'un .jar
    Par ToMs dans le forum Général Java
    Réponses: 3
    Dernier message: 28/04/2006, 11h56
  4. [Free Pascal] Erreur lors de l'éxecution. (exitcode = 106)
    Par phoebos dans le forum Free Pascal
    Réponses: 2
    Dernier message: 03/03/2006, 22h24
  5. Erreur lors de l'execution d'un script jsp
    Par tuxor dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 06/08/2004, 12h35

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