Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 30/05/2011, 18h05   #1
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Par défaut Dépassement arithmétique dans un trigger

Bonjour à tous.
Je suis en train de creer un trigger qui permet de générer un IBAN a la création d'un compte. Pour cela je dois faire le modulo 97 d'un nombre à 27 chiffres.

Tel quel, j'obtiens une erreur de type
Citation:
Msg*248, Niveau*16, État*1, Procédure*CHECK_DIGIT, Ligne*19
La conversion de la valeur varchar '300040082802587413691152700' a dépassé une colonne int.
On m'a conseillé de faire un cast en bigint, mais le bigint ne tient pas la charge non plus et me donne ce type de message:
Citation:
Msg*8115, Niveau*16, État*2, Procédure*CHECK_DIGIT, Ligne*18
Une erreur de dépassement arithmétique s'est produite lors de la conversion de expression en type de données bigint.
Auriez vous une solution pour contourner ce problème?

Merci d'avance.
YuanYevon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 18h18   #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
Normal car vous êtes en dépassement de capacité même pour un BIGINT.

Postez votre code pour que nous puissions vous aider.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 18h25   #3
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Bonjour et merci,

Voici le code du trigger:
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
USE [IBAN]
GO
/****** Object:  Trigger [dbo].[CHECK_DIGIT]    Script Date: 05/30/2011 17:22:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[CHECK_DIGIT]
ON [dbo].[COMPTE]
FOR INSERT
AS
BEGIN
DECLARE @iban CHAR(27);
DECLARE @ibanApresModulo CHAR(27);
DECLARE @checkDigit CHAR(2);
DECLARE @codeBanque CHAR(10);
DECLARE @numCompte CHAR(11);
DECLARE @cleRib CHAR(2);
 
SELECT @codeBanque = codeBanque FROM inserted;
SELECT @numCompte = numCompte FROM inserted;
SELECT @cleRib = cleRib FROM inserted;
 
SELECT @iban = @codeBanque + @numCompte + '1527' + '00';
/*select CAST(@iban AS BIGINT)*/
SELECT @ibanApresModulo = @iban % 97;
SELECT @checkDigit = 98-@ibanApresModulo;
SELECT @iban = 'FR' + @checkDigit + @codeBanque + @numCompte + @cleRib;
 
UPDATE compte 
SET iban = @iban
WHERE numCompte = @numCompte;
END
Et voici le type d'insertion lors du trigger:
Code :
INSERT INTO COMPTE VALUES ('02587413691','3000400828','1','01','')
Dans l'ordre on a numCompte, codeBanque, codeClient, cleRib, et ce qui doit stocker l'iban fini.

Merci encore.

EDIT: En cherchant des infos sur la façon "manuelle" de calculer le modulo des grands nombre j'ai trouvé ce message qui donnait la solution:
http://www.developpez.net/forums/d32...-grand-nombre/
Le problème est donc résolu, merci tout de même à Mikedavem.
YuanYevon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 13h25   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Notez tout de même que votre trigger pourrait s’écrire ainsi (sans résoudre le problème du modulo) avec un trigger instead of insert(on pourrait faire le même principe avec un trigger for insert) :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
ALTER TRIGGER [dbo].[CHECK_DIGIT]
ON [dbo].[COMPTE]
INSTEAD OF INSERT
AS
BEGIN
 
	INSERT INTO compte(laColonneIban, lesAutresColonnes)
	SELECT
		'FR' + 98-((codeBanque + numCompte + '1527' + '00')%97) + codeBanque + numCompte + cleRib
		,lesAutresColonnes
	FROM INSERTED
 
END

plus simple non ?!?

1/ cela évite toutes ces variables inutiles
2/ cela prend en charge les insertions multilignes

Mais plus que ça, vous pourriez créer une fonction qui calcule le IBAN à partir des autres informations, et créer une colonne calculée (eventuellement persistente et eventuellement indexée) dans votre table, et vous passer ainsi d'un couteux trigger.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 17h24   #5
Invité de passage
 
Étudiant
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
C'est noté, en effet ça m'as l'air beaucoup plus simple.
YuanYevon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h28.


 
 
 
 
Partenaires

Hébergement Web