|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() |
Bonjour,
Je travaille actuellement dans un environnement Sybase 12.0/Unix. Un script importe quotidiennement des données via un bcp. Je rencontre un pb avec des fichiers d'import qui contiennent des données complètement farfelues. Précisement : Colonne source : DATE_VL -> CHAR (10) Colonne destination (en base) : DATE_VALO -> SMALLDATETIME Exemple de données erronnées qui font planter les proc liées : DATE_VL : "2007/17/07 5:35 PM" Je devrais avoir à la place : DATE_VALO : "17/07/2007 17:35" La conversion renvoie une erreur et oblige la procédure à sortir en erreur. Je recherche un moyen d'annuler la connversion si celle-ci revient en erreur. Je pensais faire quelque chose du genre : -------------------------------------------------------------------- DECLARE @DATE_VL CHAR (10) DECLARE @DATE_VALO SMALLDATETIME DECLARE @MESSAGE VARCHAR (128) SELECT @DATE_VALO = (CONVERT (@DATE_VL,SMALLDATETIME)) SELECT @@ERROR IF @@ERROR <> 0 BEGIN SELECT@MESSAGE = "DONNEE INCORRECTE" ROLLBACK TRAN RETURN END ELSE BEGIN SELECT @MESSAGE =" DONNEE OK" END SELECT @MESSAGE COMMIT TRAN ------------------------------------------------------------------------ Le pb est que l'erreur dans la conversion empêche la suite de l'exécution de la requête. De ce fait, la condition IF ne fonctionne que quand il n'y a pas d'erreur. Pouvez-vous m'aider à trouver une parade ? Par avance, je vous remercie. |
|
|
00
|
|
|
#2 |
![]() ![]() |
Je ne suis pas sûre de bien comprendre la séquence.
En principe, la chaine "2007/17/07 5:35 PM" est comprise par Sybase comme une date. Donc un bcp in de cette chaine vers un champ de type DATETIME doit fonctionner correctement. De même, un CONVERT(datetime, "2007/17/07 5:35 PM") ne devrait pas poser de problème non plus. Est-ce que tu peux préciser le problème ? Merci, Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() |
Je dois avouer que c'est suprenant mais Sybase n'arrive effectivement pas à convertir la donnée suivante en datetime :
DECLARE @DATE_VL VARCHAR (128) DECLARE @DATE_VALO DATETIME SELECT @DATE_VL = "2007/17/07 5:35 PM" SELECT @DATE_VALO = CONVERT (DATETIME,@DATE_VL) J'obtiens l'erreur suivante : "Arithmetic overflow during explicit conversion of CHAR value '2007/17/07' to a DATETIME field"
|
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() |
de manière générale, je cherche à intercepter une erreur de conversion et à effectuer une action dans ce cas, par exemple insérer la ligne en erreur dans une table temporaire et afficher un message d'erreur personnalisé.
|
|
|
00
|
|
|
#5 |
![]() ![]() |
Pff... j'avais mal lu. Evidemment, 2007/17/07 va poser problème (il n'y a en général pas de mois 17
Il est possible que l'on puisse gérer cela via (sous ASE 15.0.1 il y a bien une fonction isdate(), mais cela ne va pas beaucoup t'aider...) Michael
__________________
Michael Peppler Membre de TeamSybase - www.teamsybase.com "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() |
Je dois préciser la version de sybase utilisée : 12.5.4
j'imagine que c'est pour cela que la fonction indiquée ci-dessus ne fonctionne pas ... Sniff ! |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 056 ![]() |
si si elle existe mais pourquoi ne pas utiliser :
Code :
__________________
Emmanuel T. |
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() |
Je pense que ma question initiale a été mal comprise, donc je reprend :
Dans le cadre de mon projet, je reçois des fichiers texte de l'extérieur via un bcp in. Avant d'intégrer ces données dans les tables, je dois passer par des étapes de cv de conversions dont celle du datetime est un exemple. Mon problème est qu'avec la version 12.5.04 de Sybase ASE, je fais face à des limitations. Mon soucis est qu'une erreur de conversion de données entraine non seulement un message d'erreur mais surtout amène une sortie inconditionnelle du script. Or je voudrais justement pouvoir trouver un moyen de forcer Sybase à continuer le déroulement du script afin de pouvoir récupérer la valeur de @@error et d'agir en fonction de ce qu'elle contient. J'espère que vous pourrez m'aider ... @ bientôt !
|
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 056 ![]() |
désolé, je relirais les posts depuis le début promis
Un peu à l'arrache, tu pourrais peut-être passer par une petite procédure stockée qui fera ce que tu fais pour tester la date. Du genre : create proc test_date(@date varchar(30)) as declare @toto datetime select @toto=convert(datetime,@date) return 0 ce qui fait que si ta @date est une vraie date, tu auras un retour 0 sinon elle se vautrera avec le code qui va bien (!= 0 ça c'est sûr) donc ensuite, pour chaque date : declare @retcode=exec test_date(@date_vl) if @retcode = 0 machin else bidule Mais tu auras tjrs ton msg d'erreur affiché à l'écran
__________________
Emmanuel T. |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() |
Très bonne idée que tu propose !
Malheureusement, j'obtiens une erreur à ce niveau : DECLARE @RETCODE = EXEC TEST_DONNEE (@DONNEE) Sniff
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 056 ![]() |
pardon, chui un peu fatigué :
__________________
Emmanuel T. |
|
|
00
|
|
|
#12 |
![]() ![]() |
Vous avez un SET DATEFORMAT de quel type ?
__________________
Sr DBA Oracle / Sybase / MS-SQL / DB2 / Informix / Postgresql Administrateur SAP Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com