Comparaison de Varchar(20)
Résolu
xav3601
Messages postés
3289
Date d'inscription
Statut
Membre
Dernière intervention
-
Lazarey Messages postés 3239 Date d'inscription Statut Membre Dernière intervention -
Lazarey Messages postés 3239 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'ai une requête SQL qui me retourne cette erreur:
The conversion of the varchar value '78532973952750862890' overflowed an int column. Maximum integer value exceeded.
J'ai cru comprendre que SQL convertissait ce varchar en Int pour la comparaison et que le problème venait de là?
Y'a-t-il une solution pour éviter ce genre de problème?
j'ai une requête SQL qui me retourne cette erreur:
The conversion of the varchar value '78532973952750862890' overflowed an int column. Maximum integer value exceeded.
J'ai cru comprendre que SQL convertissait ce varchar en Int pour la comparaison et que le problème venait de là?
Y'a-t-il une solution pour éviter ce genre de problème?
A voir également:
- Comparaison de Varchar(20)
- Comparaison million milliard - Accueil - Technologies
- Telecharger fl studio 20 pour pc gratuit complet - Télécharger - Édition & Montage
- Logiciel comparaison photo gratuit - Télécharger - Photo & Graphisme
- Mettre une note sur 20 ✓ - Forum Bureautique
- Comment mettre une note sur 20 ✓ - Forum Bureautique
12 réponses
En l'occurence c'est une procédure stockée qui génére une requête SQL dynamiquement, la voilà en simplifié:
J'ai essayé de forcer une conversion en BIGINT mais j'obtiens toujours la même chose...
@psnum_cde varchar(20) BEGIN set @strSQL = 'SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = ''INVOIC''' BEGIN set @strSQL = @strSQL + ' AND NUCDE = '''+@psnum_cde+'''' END set @strSQL = @strSQL + 'ORDER BY DTFAC DESC' EXEC sp_executeSQL @strSQL END
J'ai essayé de forcer une conversion en BIGINT mais j'obtiens toujours la même chose...
Et du coup NUCDE c'est pas un varchar ?? Essaye plutôt de convertir celui-là en varchar et de faire la comparaison avec un LIKE.
Ben si...
Ma colonne NUCDE est bien de type VARCHAR(20) dans ma base!
Mais apparement pour comparer les VARCHAR il passe par des INT...
Je vais essayer de faire un LIKE pour voir
La culture c'est comme la confiture, moins en a plus on l'étale!
Ma colonne NUCDE est bien de type VARCHAR(20) dans ma base!
Mais apparement pour comparer les VARCHAR il passe par des INT...
Je vais essayer de faire un LIKE pour voir
La culture c'est comme la confiture, moins en a plus on l'étale!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
C'est très bizarre. Et tu as essayé d'exécuter ta requêtes avec de vraies valeurs sans passer par ta procédure ??
Comme ça :
Comme ça :
SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = 'INVOIC' AND NUCDE = 1 ;
Si je lance la requête:
SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = 'INVOIC' AND NUCDE = '78532973952750862890'
Par SQL Server Manager, ca marche très bien!
Par contre dès que je passe par ma proc stock, l'erreur apparait...
Peut être qu'en modifiant le type de la colonne dans la base en BigInt ca passerait, sauf que j'ai pas la main sur la base...
Donc pas possible de tester :S
SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = 'INVOIC' AND NUCDE = '78532973952750862890'
Par SQL Server Manager, ca marche très bien!
Par contre dès que je passe par ma proc stock, l'erreur apparait...
Peut être qu'en modifiant le type de la colonne dans la base en BigInt ca passerait, sauf que j'ai pas la main sur la base...
Donc pas possible de tester :S
Non pas la peine de modifier le type vue que ça passe quand on entre direct la requête. Le problème est sur ta procédure. Je dirai un problème de guillemets. C'est pour ça qu'il pense que tu compares avec un chiffre alors que c'est une chaine.
Ya pas moyen d'afficher la requête générée pour voir si elle est correcte ?
Ya pas moyen d'afficher la requête générée pour voir si elle est correcte ?
C'est bien facheux ^^
N'y connaissant pas grand chose, je te propose un petit dbms ouput :
sans grande conviction
N'y connaissant pas grand chose, je te propose un petit dbms ouput :
DBMS OUTPUT.PUT LINE(@strSQL)
sans grande conviction
A priori la syntaxe obtenu est celle-ci:
SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = 'INVOIC' AND NUCDE = '78532973952750862890'
Si je me fie aux couleur dans l'editeur SQL!
SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = 'INVOIC' AND NUCDE = '78532973952750862890'
Si je me fie aux couleur dans l'editeur SQL!
Donc apparament pour échapper un caractère c'est anti-slash qu'il faut utiliser. Essaye donc ceci :
Dis moi...
@psnum_cde varchar(20) BEGIN set @strSQL = 'SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = \'INVOIC\'' BEGIN set @strSQL = @strSQL + ' AND NUCDE = \''+@psnum_cde+'\'' END set @strSQL = @strSQL + 'ORDER BY DTFAC DESC' EXEC sp_executeSQL @strSQL END
Dis moi...
J'avais déjà essayer d'échapper un caractère de la sorte, puisque ca se fait comme ca d'habitude!
Mais ca marchais pas et en fait c'est avec un ' qu'on échappe un caractère apparement!
Par exemple cette ligne fonctionne très bien dans la proc stock:
set @strSQL = @strSQL + ' AND DTFAC LIKE ''%'+@psannee+'%'''
Mais ca marchais pas et en fait c'est avec un ' qu'on échappe un caractère apparement!
Par exemple cette ligne fonctionne très bien dans la proc stock:
set @strSQL = @strSQL + ' AND DTFAC LIKE ''%'+@psannee+'%'''
Et non justement. Le caractère ' sert à définir ce qui est textuel de ce qui ne l'est pas. C'est normal que cette ligne fonctionne. Mais dans ton cas, l'analyseur ne sait pas faire la différence entre les ' qui séparent les parties textes des autres parties et les ' qui font parti de la requête que tu génère.
Je viens de voir que pour échapper un ' il faut le doubler. Donc ça donne :
Il n'y a qu'une seule chose qui change c'est qu'il y a 3 ' devant INVOIC. Essaye ça et dis moi.
Si ce n'est pas ça je t'avoue que je ne sais plus trop quoi faire...
Je viens de voir que pour échapper un ' il faut le doubler. Donc ça donne :
@psnum_cde varchar(20) BEGIN set @strSQL = 'SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = ''INVOIC''' BEGIN set @strSQL = @strSQL + ' AND NUCDE = '''+@psnum_cde+'''' END set @strSQL = @strSQL + 'ORDER BY DTFAC DESC' EXEC sp_executeSQL @strSQL END
Il n'y a qu'une seule chose qui change c'est qu'il y a 3 ' devant INVOIC. Essaye ça et dis moi.
Si ce n'est pas ça je t'avoue que je ne sais plus trop quoi faire...
peut-être sur la concaténation.
Essaye d'utiliser le double | à la place du + :
Mais essaye d'afficher les résultats du print pour qu'on voit à quoi elles ressemblent les requêtes.
Essaye d'utiliser le double | à la place du + :
psnum_cde varchar(20) BEGIN set @strSQL = 'SELECT * FROM EDFTENT WHERE CDTYPMSGEDI = ''INVOIC''' BEGIN set @strSQL = @strSQL || ' AND NUCDE = ''' || @psnum_cde || '''' END set @strSQL = @strSQL || 'ORDER BY DTFAC DESC' EXEC sp_executeSQL @strSQL END
Mais essaye d'afficher les résultats du print pour qu'on voit à quoi elles ressemblent les requêtes.
J'ai trouvé...
Et en fait tu ne pouvais pas trouvé j'avais loupé mon copier-coller en haut et il manquait le if!
Et c'était la dedans que tout ce jouer:
j'avais mis if @psnum_cde != 0
Du c'est à cet endroit qu'il convertissait en int...
Merci de ton aide!
Et en fait tu ne pouvais pas trouvé j'avais loupé mon copier-coller en haut et il manquait le if!
Et c'était la dedans que tout ce jouer:
j'avais mis if @psnum_cde != 0
Du c'est à cet endroit qu'il convertissait en int...
Merci de ton aide!