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 :
n'est pas le même en V11 qu'en V12. S'agît-il du paramétrage ou de vraie évolution de ASE ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part "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" du serveur.
J'ai fait de nombreux tests (trop pour les citer tous), en voici un le plus simple:
Ce script "croise" les 2 modes AINSINULL/2 types d'initialisation/2 types de tests.
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 set nocount on print ' AINSINULL OFF' GO set ANSINULL OFF declare @vnull varchar(1) select @vnull='' print "select @vnull=''" IF (@vnull IS NOT null) print "TEST IS : vnull IS NOT null " ELSE print "TEST IS : vnull IS null " IF (@vnull != null ) print "TEST = : vnull != null " ELSE print "TEST = : vnull =null " select @vnull=NULL print "***" select @vnull=NULL print "select @vnull=null" IF (@vnull IS NOT null) print "TEST IS : vnull IS NOT null " ELSE print "TEST IS : vnull IS null " IF (@vnull != null ) print "TEST = : vnull != null " ELSE print "TEST = : vnull =null " -- set ANSINULL ON select @vnull='' print "" print ' AINSINULL ON' print "select @vnull=''" IF (@vnull IS NOT null) print "TEST IS : vnull IS NOT null " ELSE print "TEST IS : vnull IS null " IF (@vnull != null ) print "TEST = : vnull != null " ELSE print "TEST = : vnull =null " print "***" select @vnull=NULL print "select @vnull=null" IF (@vnull IS NOT null) print "TEST IS : vnull IS NOT null " ELSE print "TEST IS : vnull IS null " IF (@vnull != null ) print "TEST = : vnull != null " ELSE print "TEST = : vnull =null " GO
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:
Je présente ce cas d'école, parce que je cherche à comprendre pourquoi mes procédures en V12 ne donnent pas le même résultat qu'en V11. Pour ce qui concerne ce premier test, le résultat en V11 et V12 est identique. J'en ai fait d'autres où je trouve de différences entre versions. Mais avant d'en parler, pouvez-vous m'aider à interpréter le résultat cité ci-dessus ?
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 AINSINULL OFF select @vnull='' TEST IS : vnull IS NOT null TEST = : vnull != null *** select @vnull=null TEST IS : vnull IS null TEST = : vnull =null AINSINULL ON select @vnull='' TEST IS : vnull IS NOT null TEST = : vnull =null *** select @vnull=null TEST IS : vnull IS null TEST = : vnull =null
Dans notre application écrite pour V11:
- la plupart de tests est faite avec = null / != null.
- les affectation sont faits souvent par ='' (et non =null)
- la valeur AINSINULL par défaut (selon la doc) est bien OFF
Cela ne devait donc pas bien marcher (cf. mon test) et pourtant ça fonctionne. Je ne l'explique pas au vu de mon résultat.
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.
Partager