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
    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
    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

    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
    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
    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

###raw>template_hook.ano_emploi###