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 : Sélectionner tout - Visualiser dans une fenêtre à part
"if (@var is null or ltrim(rtrim(@var)) !="")
n'est pas le même en V11 qu'en V12. S'agît-il du paramétrage ou de vraie évolution de ASE ?

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:

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
Ce script "croise" les 2 modes AINSINULL/2 types d'initialisation/2 types de tests.
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 : 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
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 ?

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.