|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : mars 2007 Messages : 248 ![]() |
Bonjour
Suite à ma migration ASE de V11.0 en V12.0, je suis confrontée aux erreurs d'exécutions de procédures stockées ( plus de 1500 procédures à migrer). Ces problèmes sont liés, me seble-t-il à la gestion des varchar et plus particulièrement de valeurs nulles ou composées d'espaces uniquement. Par exemple: En V11 : right('abcd ',2) donne ''cd' alors qu'en V12 il donne 'd '. Je constate aussi que le résultat des tests de type : Code :
"if (@var is null or ltrim(rtrim(@var)) !="") Vu le nombre de mes procédures, je me demande si cela ne pouvait se régler par un paramétrage (option un peu "magique" J'ai fait de nombreux tests (trop pour les citer tous), en voici un le plus simple: Code :
Le résultat varie en fonction du mode (je peux l'admettre) mais aussi en fonction du type d'affectation: ='' et =null produisent par la suite des réultats différents du test de la valeur nulle. Je ne trouve pas d'explication au résultat obtenu: Code :
Dans notre application écrite pour V11:
Est-ce qu'on peut paramétrer AINSINULL au niveau du serveur ? De façon générale, comment connaitre la valeur courante d'une option "set" sans avoir à tester et deviner par déduction ? Merci d'avance msomso P.S. En pièces jointes le code sql est résultat en V11 et V12. |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Sur un serveur 12.5.3 j'ai:
Code :
Pour les problème de NULL il faudra attendre demain - je regarderai cela d'un peu plus près. 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 | ||||||||
![]() ![]() |
Pour les NULLs (et non pas pour les nulls
Lorsque ANSINULL est en marche, on ne peut jamais utiliser = pour faire une comparaison avec NULL, ce qui veut dire que ton test: Code :
Code :
Si ne mets ANSINULL off: Code :
Code :
Donc un varchar() auquel on assigne '' devient ' ' est n'est en conséquence pas NULL. En résumé: pour tester la nullitude d'une valeur/variable il est très fortement recommendé d'utiliser IS NULL/IS NOT NULL pour éviter toute confusion. 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
|
|
|
#4 | |
|
Membre du Club
![]() Inscription : mars 2007 Messages : 248 ![]() |
Bonjour
Citation:
Mais par la suite j'ai découvert d'autres incompatibilités. Par exemple, pour une @var variable varchar(1) étant nulle ou contenant un espace, le test : Code :
IF (@var != NULL AND ltrim(rtrim(@var)) !="") Notre @var est un paramétre IN d'une procédure stockée "P1". Cette procédure est appellée par Power Builder qui lui affecte la valeur d'un champ sur écran (champ "vide" en occurence). Elle appelle ensuite la procédure stockée "P2". La variable @var ne subit aucune transformation entre IHM et "P2". Le but du test est d'exclure du traitement les cas de valeurs nulls ou composées uniquement d'un blanc. Ceci marche en V11, mais en V12 le traitement se declenche et se termine en erreur car il ne s'attend pas à cette valeur compte tenu du test avant son appel. Je pense qu'après avoir corrigé ce cas, j'en trouverai d'autres cas: j'ai >600 tests de nulls avec =/!= dans mes procs. Personnellement, je teste tjrs par is null/is not null , mais je voudrais éviter des corrections en masse du code existant. D'autant plus que même en V12 le résultat depend, semblait-il, de type d'affectation: selon mon test cité au début, select @var='' ou select @var=null ne donnent pas la même chose dans le mode ainsinull off. Je voudrais donc trouver une solution générale à mon problème de migration de procédures stockées. Merci msomso P.S. Michael, je reprends tes tests et je vais continuer mes refléxions. Est-il possible de positionner option AINSINULL au niveau serveur ? |
|
|
|
00
|
|
|
#5 | ||||
![]() ![]() |
En fait, la solution semble assez simple:
Code :
Code :
Pour ANSINULL il faut que je regarde - en principe c'est un paramètre de connexion. Il peut être positionné par défaut pour une session "OpenClient" via le fichier ocs.cfg (%SYBASE%/OCS-12_0/config/ocs.cfg), mais ce n'est de loins pas sûr que cela marche avec PowerBuilder. 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 |
|
Membre du Club
![]() Inscription : mars 2007 Messages : 248 ![]() |
Bonsoir
En effet ce que tu suggéres Michael, fonctionne ! Moi, entre temps j'ai appliqué le test de acsii(@var) != null and ascii(@var) != 32. Le problème s'est éclairci dans ma tête: il fallait tester/exclure la chaîne vide (= null ou bien composé d'un espace). Ouff ! Ceci étant dit, je rencontre d'autres "particularité", divergeances dans le test des valeurs null entre V11 et V12. Je commence à me résigner à les corriger au cas par cas. Merci msomso Saurais-tu me dire comment faire un CD avec la doc complète de V12 à partir du site que tu m'as indiqué: http://sybooks.sybase.com/nav/detail.do?docset=1145 |
|
|
00
|
|
|
#7 | |
![]() ![]() |
Citation:
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
|
|
|
#8 |
|
Membre du Club
![]() Inscription : mars 2007 Messages : 248 ![]() |
Merci beaucoup
msosmo |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com