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

Développement SQL Server Discussion :

Problème utilisation du modulo


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    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 : 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
     
     
    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

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce qui est étonnant c'est que SQL-Server 2005 répond bien à cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select cast('14277630003022800002030329785' as DECIMAL(38)) % 97 as res
     
    res
    ---------------------------------------
    37

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 14277630003022800002030329785 % 97 AS res
    Erreur sous Sql serveur 2000 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    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

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

Discussions similaires

  1. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [JSTL] [EL] Problème utilisation <c:out>
    Par XavierL dans le forum Taglibs
    Réponses: 7
    Dernier message: 14/08/2005, 20h12
  4. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  5. [JAR]Problème utilisation manifest et jar
    Par doudine dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/01/2005, 10h21

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