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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 715
    Points : 47
    Points
    47

    Par défaut 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 confirmé Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    4 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 691
    Points : 5 442
    Points
    5 442

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 715
    Points : 47
    Points
    47

    Par défaut

    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 confirmé Avatar de 7gyY9w1ZY6ySRgPeaefZ
    Homme Profil pro
    dba
    Inscrit en
    juillet 2007
    Messages
    4 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : juillet 2007
    Messages : 4 691
    Points : 5 442
    Points
    5 442

    Par défaut

    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.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 243
    Points : 10 857
    Points
    10 857

    Par défaut

    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é
    Profil pro
    Inscrit en
    octobre 2002
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2002
    Messages : 916
    Points : 1 097
    Points
    1 097

    Par défaut

    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

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 243
    Points : 10 857
    Points
    10 857

    Par défaut

    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

Discussions similaires

  1. [2012] Échec de la conversion de la valeur varchar en type de données int.
    Par djelloharmel dans le forum Développement
    Réponses: 4
    Dernier message: 25/09/2015, 23h56
  2. Réponses: 11
    Dernier message: 11/08/2014, 21h14
  3. Réponses: 1
    Dernier message: 13/02/2010, 13h44
  4. Trigger : Récupérer la valeur par défaut d'une colonne
    Par mcspr2002 dans le forum Administration
    Réponses: 5
    Dernier message: 12/01/2007, 13h53
  5. Réponses: 2
    Dernier message: 06/07/2004, 17h46

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