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 :

La conversion de la valeur varchar a dépassé une colonne int.


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    La conversion de la valeur varchar a dépassé une colonne int.
    Bonjour à tous,

    je dispose d'une requête SQL:
    (récupéré directement dans notre outil métier)
    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
    SELECT convert(int,tgivaventa.NumFactura) AS numfacture,
           tgApunteContab.Cta,
           tgApunteContab.DH,
           tgApunteContab.Importe,
           tgApunteContab.Descrip,
           tgApunteContab.SubCta,
           tgApunteContab.ClaveAnalitica
    FROM tgivaventabase
    LEFT OUTER JOIN tgIvaTipo ON tgivaventabase.TipoIVA = tgIvaTipo.Codigo
    LEFT OUTER JOIN tgivaventa ON tgivaventa.emp=tgivaventabase.Emp
    AND tgivaventa.Origen=tgivaventabase.Origen
    AND tgivaventa.ContadorAno=tgivaventabase.ContadorAno
    AND tgivaventa.ContadorCodigo=tgivaventabase.ContadorCodigo
    AND tgivaventa.ContadorValor=tgivaventabase.ContadorValor
    LEFT JOIN tcVehFactur ON (tcVehFactur.Emp = tgivaventa.Emp
                              AND tcVehFactur.Expediente = tgivaventa.NumInterno
                              AND tcVehFactur.ContadorValor = tgivaventa.NumFactura)
    LEFT OUTER JOIN TCTIPOFACVENTA ON TGIVAVENTA.TIPOFACTURACION = TCTIPOFACVENTA.TIPOFACTURACION
    AND TGIVAVENTA.EMP = TCTIPOFACVENTA.EMP
    LEFT OUTER JOIN TGTIPOFACTURACION ON TGIVAVENTA.TIPOFACTURACION = TGTIPOFACTURACION.TIPOFACTURACION
    LEFT OUTER JOIN tgApunteContab ON tgApunteContab.emp=tgivaventabase.Emp
    AND tgApunteContab.Origen=tgivaventabase.Origen
    AND tgApunteContab.ContadorAno=tgivaventabase.ContadorAno
    AND tgApunteContab.ContadorCodigo=tgivaventabase.ContadorCodigo
    AND tgApunteContab.ContadorValor=tgivaventabase.ContadorValor
    LEFT OUTER JOIN tgCtaPGC ON tgApunteContab.Emp = tgCtaPGC.emp
    AND tgApunteContab.Cta = tgCtaPGC.cta
    AND tgApunteContab.SubCta = tgCtaPGC.subcta
    WHERE (tgivaventabase.Emp = '002')
      AND (tgivaventabase.ContadorAno >= YEAR('2015-01-01'))
      AND (Convert(datetime, Convert(varchar,TGIVAVENTA.FECHAFACTUR, 103), 103) >= '01/01/2015')
      AND tgApunteContab.Cta LIKE '707%'
    ORDER BY TGIVAVENTA.FechaFactur


    elle me retourne erreur " La conversion de la valeur varchar '201501200064551' a dépassé une colonne int."

    Si je met une étoile dans le select ou une étoile + les champs demandés, La requête fonctionne j'ai des résultat.
    (Select * FROM ... / SELECT *,convert(int,tgivaventa.NumFactura) AS numfacture, tgApunteContab.Cta, tgApunteContab.DH, tgApunteContab.Importe, etc...)

    je comprend pas ce retour en erreur.

    Pourriez-vous m'aiguiller sur ce problème, ou est-ce que que j'ai commis une erreur

    Merci

    guigui69

  2. #2
    Expert éminent
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

  3. #3
    Membre du Club
    Bonjour,

    je voudrais bien comprend pourquoi le type de donnée peut jouer, car j'ai erreur si je demande uniquement avec les colonnes voulues:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT convert(int,tgivaventa.NumFactura) AS numfacture,        tgApunteContab.Cta,        tgApunteContab.DH,        tgApunteContab.Importe,        tgApunteContab.Descrip,         tgApunteContab.SubCta,        tgApunteContab.ClaveAnalitica


    Par contre si je fait ceci:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT *, convert(int,tgivaventa.NumFactura) AS numfacture,        tgApunteContab.Cta,        tgApunteContab.DH,        tgApunteContab.Importe,        tgApunteContab.Descrip,        tgApunteContab.SubCta,        tgApunteContab.ClaveAnalitica


    J'ai pas erreur

  4. #4
    Expert éminent
    C'est comme impossible de ne pas avoir la même erreur sauf si les requêtes sont différentes. Est-ce réellement la même clause where ? Le même environnement ?

    En tout cas, ça pique les yeux ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      AND (tgivaventabase.ContadorAno >= YEAR('2015-01-01'))
      AND (Convert(datetime, Convert(varchar,TGIVAVENTA.FECHAFACTUR, 103), 103) >= '01/01/2015')


    YEAR('2015-01-01')) ? Euh ça donne 2015, non ?
    La deuxième ligne, beaucoup de conversion alors que TGIVAVENTA.FECHAFACTUR >= '2015-01-01' fait la job bien plus efficacement si FECHAFACTUR est au format date ou assimilés.
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

  5. #5
    Modérateur

    impossible, ou presque !

    Le fait d'ajouter ou de supprimer des colonnes du SELECT peut faire varier le plan d'exécution.
    Et en fonction de l'ordre d'application des filtres, il se peut que l'erreur de conversion ne surviennent plus, car la ligne contenant la valeur qui pose problème aura été filtrée en amont...

    Savoir d'où provient cette valeur donnerait un bon début de piste, mais surtout, connaitre le type de chaque colonne semble indispensable pour investiguer... peut-on avoir la structure des tables ?

  6. #6
    Membre éprouvé
    Bonjour,
    Si je lis bien le message d'erreur dans ta table tgivaventa tu as une ligne dont le NumFactura='201501200064551' qui ne peut pas être converti en entier.
    Vérifie cela avec un select tout simple.
    Après selon le plan d'execution la conversion de cette valeur en entier pose problème ou pas.
    Pour résoudre ton problème si tu étais en SQL brut, je te conseillerai
    1. d'utiliser un try cast plutôt qu'un cast
    2. de faire un cast en bigint plutôt!

    Mais je ne sais pas ce que permet de faire ton logiciel métier.
    Tu peux aussi chercher pourquoi la ligne existe mais là, c'est à toi de jouer.
    Cordialement
    Soazig

  7. #7
    Modérateur

    Le message donne la valeur qui pose probléme, mais pas la colonne d'où elle provient.

    L'erreur peut provenir d'une conversion implicite.

    ça pourrait par exemple être la colonne ContadorAno, qui serait en VARCHAR, et provoquerait l'erreur lors d'une conversion implicite pour la clause (tgivaventabase.ContadorAno >= YEAR('2015-01-01')).

    ça semble d'ailleurs plus probable, car si l'erreur provenait de la conversion explicite dans le SELECT, elle serait toujours remontée, indépendamment du plan d’exécution