Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 15h39   #1
Invité de passage
 
Inscription : avril 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 4
Points : 0
Points : 0
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
mb_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h53   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Postez nous votre code

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 17h38   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/04/2011, 11h18   #4
Invité de passage
 
Inscription : avril 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 4
Points : 0
Points : 0
Seulement le Rollback arrive après.

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

Voici le code :
Code :
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
mb_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 12h57   #5
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Vous devez avoir XACT_ABORT à ON dans votre cas.

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

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 14h15   #6
Invité de passage
 
Inscription : avril 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 4
Points : 0
Points : 0
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 ...
mb_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 16h01   #7
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
J'ai repris votre code tel quel pour tester et chez moi je n'ai pas de souci.

Essayez quand même en forcant le paramètre de votre session avec un SET XACT_ABORT OFF avant l'exécution de votre code.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 17h08   #8
Invité de passage
 
Inscription : avril 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 4
Points : 0
Points : 0
J'ai déjà essayé suite à votre retour.

Mais chez moi cela fonctionne aussi lorsque je n'ai pas l'objet TABLE déjà en base.
Mais lorsque la table (TAMPON_RETRO_INTERCO_M4) existe déjà en base mais que le fichier txt n'est pas à l'endroit prévu cela ne fonctionne plus.

De même lorsque je veux créer un table qui existe déjà dans la base j'ai le même souci.
J'ai l'impression que cela dépend du niveau d'erreur un truc dans le genre ...

Merci à vous
mb_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h56.


 
 
 
 
Partenaires

Hébergement Web