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 03/01/2011, 13h54   #1
Membre habitué
 
Inscription : juillet 2006
Messages : 207
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 207
Points : 134
Points : 134
Par défaut Problème utilisation du modulo

Bonjour,

j'ai un petit soucis. J'essaie d'utiliser le modulo sur mon nombre (qui est une chaîne de caractère). Le problème est qu'il est trop grand.

J'essaie de faire ceci :
Code :
CONVERT(BIGINT, '14277630003022800002030329785') % 97
Le problème est, bien sur, que mon string est trop grand pour être contenu dans un BIGINT. Mais quand je met un type plus grand genre DECIMAL(38, 0) ou NUMERIC(38, 0) ou FLOAT, il me dit que le modulo ne prend que des types INT.
Quelqu'un saurait comment je peux contourner le problème ? Merci beaucoup.
__________________
Tox
toxycyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 14h38   #2
Membre habitué
 
Inscription : juillet 2006
Messages : 207
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 207
Points : 134
Points : 134
Bon bah j'ai trouve tout seul. On est obligé de passer par un algo, on ne peut pas utiliser l’opération de base.

La proc pour ceux qui auront le meme problème :

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
 
 
CREATE	FUNCTION MODULO
(	@vcChiffre		VARCHAR(40),
	@iValeurModulo	INT
)
 
RETURNS	INT
AS
BEGIN
 
DECLARE	@vcReste		VARCHAR(40),
		@iModulo		INT,
		@iIndice		INT,
		@iTemporaire	INT
 
SELECT	@vcReste = @vcChiffre, @iModulo = 0
 
 
-- Boucle pour découper le chiffre en plusieurs morceaux
WHILE LEN(@vcReste) > 0
BEGIN
	SET	@iIndice = LEN(@vcReste) % 6
 
	IF @iIndice = 0		SET	@iIndice = 6
 
	SET	@iTemporaire = @iModulo * 1000000 + CONVERT(INT, SUBSTRING(@vcReste, 1, @iIndice))
 
	SET	@vcReste = SUBSTRING(@vcReste, @iIndice +1, LEN(@vcReste) - @iIndice)
 
	SET	@iModulo = @iTemporaire % @iValeurModulo
 
--	SELECT	@iTemporaire, @vcReste, @iModulo
END
 
RETURN	@iModulo
 
END
__________________
Tox
toxycyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 10h39   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ce qui est étonnant c'est que SQL-Server 2005 répond bien à cette requête :
Code :
1
2
3
4
5
SELECT 14277630003022800002030329785 % 97 AS res
 
res
---------------------------------------
37
Je me demande quel type il utilise pour le premier opérande.

Edit : en relisant le premier message, je n'ai pas les mêmes résultats, avec la conversion en DECIMAL / NUMERIC ça fonctionne.
Ça répond probablement à ma question du dessus :
Code :
1
2
3
4
5
SELECT cast('14277630003022800002030329785' AS DECIMAL(38)) % 97 AS res
 
res
---------------------------------------
37
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 14h57   #4
Membre habitué
 
Inscription : juillet 2006
Messages : 207
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 207
Points : 134
Points : 134
Bonjour,

Je suis sous sql server 2000.
Peut être que sur les versions supérieures, ils ont amélioré cette gestion du modulo, mais je ne peux pas vérifier.

Mais merci pour cette réponse.
Pour
Code :
SELECT 14277630003022800002030329785 % 97 AS res
Erreur sous Sql serveur 2000 :
Code :
1
2
3
4
5
 
Serveur*: Msg 206, Niveau 16, État 2, Ligne 1
Conflit de types d'opérandes : int est incompatible avec void type
Serveur*: Msg 8117, Niveau 16, État 1, Ligne 1
Type de données de l'opérande numeric incorrect pour l'opérateur modulo.
__________________
Tox
toxycyty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 15h02   #5
Membre habitué
 
Inscription : juillet 2006
Messages : 207
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 207
Points : 134
Points : 134
Je viens de vérifier sur un Sql 2005, et en effet, ça marche.
Donc c'est mieux gérer que sur le 2000, Merci !
__________________
Tox
toxycyty 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 15h05.


 
 
 
 
Partenaires

Hébergement Web