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 :

Gestion des erreurs


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut Gestion des erreurs
    J'ai un souci de compréhension de l'incrémentation de @@trancount.
    Je suis dans une transaction et lorsque je regarde la valeur de trancount avant une instruction sql il est à 1 puis après mon instruction il est à 0 si l'instruction a échoué et à 1 si elle a réussi.

    Il me semblait que l'incrémentation de @@trancount dépendait de begin tran ou rollback ou commit et non d'une simple instruction ???

    je cherche une explication merci

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Postez nous votre code

    ++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    C'est normal. Tout ROLLBACK purge le compteur et annule la transaction. En revanche chaque COMMIT décrémente le @@TRANCOUNT et s'il est à 1 valide la transaction et le fait passer à zéro.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut
    Seulement le Rollback arrive après.

    Je ne comprends pas pourquoi le compteur C est à 0,
    Merci

    Voici le code :
    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
    CREATE TABLE #tmpErrors (Error int) 
    Go
    set nocount on
    BEGIN TRANSACTION
    GO
    print 'le compteur A est à ' + CAST(@@TRANCOUNT AS NVARCHAR(10))
     
     
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TAMPON_RETRO_INTERCO_M4]') AND type in (N'U')) delete from [TAMPON_RETRO_INTERCO_M4]
    go
     
    print 'le compteur B est à ' + CAST(@@TRANCOUNT AS NVARCHAR(10))
    go
     
    bulk insert TAMPON_RETRO_INTERCO_M4
    from 'M:\Elocal v2\V2.01\FICHIER PLAT\TAMPON_INTERCO_M4.txt' 
    with (DataFileType='widechar',FIELDTERMINATOR ='\t',ROWTERMINATOR='\n',FIRSTROW =2)
    GO
     
    print 'le compteur C est à ' + CAST(@@TRANCOUNT AS NVARCHAR(10))
    go
     
    IF @@ERROR<>0 AND @@TRANCOUNT>0 
    begin 
    ROLLBACK TRANSACTION
    print ' !! ECHEC A L''INSERTION DES DONNEES M4'
    end
    GO
     
    print 'le compteur D est à ' + CAST(@@TRANCOUNT AS NVARCHAR(10))
    go
     
    IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
    GO
     
    print 'le compteur E est à ' + CAST(@@TRANCOUNT AS NVARCHAR(10))
    go
     
    IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
    GO
    IF @@TRANCOUNT>0 COMMIT TRANSACTION
    GO
    Résultat car je n'ai pas mis volontairement le fichier à l'emplacement prévu à cet effet

    le compteur A est à 1
    le compteur B est à 1
    Msg 4860, Niveau 16, État 1, Ligne 1
    Chargement en bloc impossible. Le fichier 'M:\Elocal v2\V2.01\FICHIER PLAT\TAMPON_INTERCO_M4.txt' n'existe pas.
    le compteur C est à 0
    le compteur D est à 0
    le compteur E est à 1

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Vous devez avoir XACT_ABORT à ON dans votre cas.

    Ce paramétre annule toute transaction si une erreur se produit.

    ++

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Par défaut
    Merci de votre retour!

    XACT_ABORT est bien sur OFF le souci ne vient a priori pas de là!

    J'ai essayé la même chose en remplaçant la partie
    "Bulk Insert ..." par du select/update/delete et là pas de problème j'obtiens bien des compteurs C à 1 même après une erreur d'exécution d'instruction.

    J'ai l'impression que cela ne réagit pas pareil avec du BuLK INSERT OU CREATE...

    Je suis preneuse si quelqu'un a une autre explication ...

Discussions similaires

  1. [FB] Gestion des erreurs et application francophone
    Par Benjamin GAGNEUX dans le forum Installation
    Réponses: 10
    Dernier message: 20/05/2006, 14h54
  2. [struts][Datasource]Gestion des erreurs
    Par GreenJay dans le forum Struts 1
    Réponses: 8
    Dernier message: 15/09/2004, 16h51
  3. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20
  4. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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