OVH Cloud OVH Cloud

Fixer CONCAT_NULL_YIELDS_NULL au niveau base de données

4 réponses
Avatar
HervéR
Bonjour tout le monde,

Je suis en train d'étudier le passage d'une bdd actuellement au niveau de
compatibilité 65 au niveau 80.
Ce qui m'embête le plus, c'est le fait qu'en 80, l'option
CONCAT_NULL_YIELDS_NULL soit par défaut positionnée sur ON.
Ce qui fait que la requête
select null + 'coucou'
renvoie
NULL
J'ai essayé de modifier ce paramètre pour la base de données, mais ce la ne
fonctionne pas :(
Voici comment j'ai procédé :
Use Master
Go
Alter Database MaBase
Set CONCAT_NULL_YIELDS_NULL OFF
Go

Un
Select DATABASEPROPERTYEX ('MaBase', 'IsNullConcat')
me renvoie pourtant bien 0
mais un
Use MaBase
select null + 'coucou'
renvoie hélàs toujours
NULL

J'ai dû louper quelque chose, mais quoi ?

4 réponses

Avatar
Fred BROUARD
La norme SQL prévoit que le NULL est "absorbant". Autement dit toute opération avec présence d'une colonne NULL doit
conduire à un résultat NULL...

Le mieux est de modifier tes requêtes pour qu'elles fonctionne sur les 2 machines en utilisant notamment la fonction
coalesce.

A +

HervéR a écrit:
Bonjour tout le monde,

Je suis en train d'étudier le passage d'une bdd actuellement au niveau de
compatibilité 65 au niveau 80.
Ce qui m'embête le plus, c'est le fait qu'en 80, l'option
CONCAT_NULL_YIELDS_NULL soit par défaut positionnée sur ON.
Ce qui fait que la requête
select null + 'coucou'
renvoie
NULL
J'ai essayé de modifier ce paramètre pour la base de données, mais ce la ne
fonctionne pas :(
Voici comment j'ai procédé :
Use Master
Go
Alter Database MaBase
Set CONCAT_NULL_YIELDS_NULL OFF
Go

Un
Select DATABASEPROPERTYEX ('MaBase', 'IsNullConcat')
me renvoie pourtant bien 0
mais un
Use MaBase
select null + 'coucou'
renvoie hélàs toujours
NULL

J'ai dû louper quelque chose, mais quoi ?





--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
bruno reiter [MVP]
Si tu teste avec QA il s'agit de paramètre de session qui écrasent les
paramètres de base voir toolsoptions

br

"HervéR" wrote in message
news:#
Bonjour tout le monde,

Je suis en train d'étudier le passage d'une bdd actuellement au niveau de
compatibilité 65 au niveau 80.
Ce qui m'embête le plus, c'est le fait qu'en 80, l'option
CONCAT_NULL_YIELDS_NULL soit par défaut positionnée sur ON.
Ce qui fait que la requête
select null + 'coucou'
renvoie
NULL
J'ai essayé de modifier ce paramètre pour la base de données, mais ce la


ne
fonctionne pas :(
Voici comment j'ai procédé :
Use Master
Go
Alter Database MaBase
Set CONCAT_NULL_YIELDS_NULL OFF
Go

Un
Select DATABASEPROPERTYEX ('MaBase', 'IsNullConcat')
me renvoie pourtant bien 0
mais un
Use MaBase
select null + 'coucou'
renvoie hélàs toujours
NULL

J'ai dû louper quelque chose, mais quoi ?




Avatar
HervéR
Je pensais faire çà un jour, mais vous (toi et Bruno Reiter) pensez donc
qu'il vaut mieux que je le fasse tout de suite !
C'est quand même un sacré boulot :(
Considérons une table de contacts comporant les classiques Titre, Prenom et
Nom.
La vue qui sous sous SQL 6.5 s'écrivait :
Titre + ' ' + Prenom + ' ' + Nom
va devenir (en prenant le cas où toutes les valeurs sont nulles et que l'on
souhaite que la valeur de la vue indique alors Null)
(Case When Coalesce(Titre, Prenom, Nom) is null then Null
else (Case When (Titre is null or Titre = '') then ''
else Titre + ' '
end) +
(Case When (Prenom is null or Prenom = '') then ''
else Prenom + ' '
end) +
(Case When (Nom is null or Nom = '') then ''
else Nom
end)
end)

C'EST PAS RIEN !!!
A moins que vous ne voyiez moins lourd !

"Fred BROUARD" a écrit dans le message de
news:
La norme SQL prévoit que le NULL est "absorbant". Autement dit toute


opération avec présence d'une colonne NULL doit
conduire à un résultat NULL...

Le mieux est de modifier tes requêtes pour qu'elles fonctionne sur les 2


machines en utilisant notamment la fonction
coalesce.

A +

HervéR a écrit:
> Bonjour tout le monde,
>
> Je suis en train d'étudier le passage d'une bdd actuellement au niveau


de
> compatibilité 65 au niveau 80.
> Ce qui m'embête le plus, c'est le fait qu'en 80, l'option
> CONCAT_NULL_YIELDS_NULL soit par défaut positionnée sur ON.
> Ce qui fait que la requête
> select null + 'coucou'
> renvoie
> NULL
> J'ai essayé de modifier ce paramètre pour la base de données, mais ce la


ne
> fonctionne pas :(
> Voici comment j'ai procédé :
> Use Master
> Go
> Alter Database MaBase
> Set CONCAT_NULL_YIELDS_NULL OFF
> Go
>
> Un
> Select DATABASEPROPERTYEX ('MaBase', 'IsNullConcat')
> me renvoie pourtant bien 0
> mais un
> Use MaBase
> select null + 'coucou'
> renvoie hélàs toujours
> NULL
>
> J'ai dû louper quelque chose, mais quoi ?
>
>

--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



Avatar
bruno reiter [MVP]
peut-etre :
coalesce(titre,'') + ' ' + coalesce(Prenom ,'') + ' ' + coalesce(Nom,'')
ou
coalesce(titre+ ' ','') + coalesce(Prenom + ' ' ,'')+ coalesce(Nom,'')

br

"HervéR" wrote in message
news:
Je pensais faire çà un jour, mais vous (toi et Bruno Reiter) pensez donc
qu'il vaut mieux que je le fasse tout de suite !
C'est quand même un sacré boulot :(
Considérons une table de contacts comporant les classiques Titre, Prenom


et
Nom.
La vue qui sous sous SQL 6.5 s'écrivait :
Titre + ' ' + Prenom + ' ' + Nom
va devenir (en prenant le cas où toutes les valeurs sont nulles et que


l'on
souhaite que la valeur de la vue indique alors Null)
(Case When Coalesce(Titre, Prenom, Nom) is null then Null
else (Case When (Titre is null or Titre = '') then ''
else Titre + ' '
end) +
(Case When (Prenom is null or Prenom = '') then ''
else Prenom + ' '
end) +
(Case When (Nom is null or Nom = '') then ''
else Nom
end)
end)

C'EST PAS RIEN !!!
A moins que vous ne voyiez moins lourd !

"Fred BROUARD" a écrit dans le message de
news:
> La norme SQL prévoit que le NULL est "absorbant". Autement dit toute
opération avec présence d'une colonne NULL doit
> conduire à un résultat NULL...
>
> Le mieux est de modifier tes requêtes pour qu'elles fonctionne sur les 2
machines en utilisant notamment la fonction
> coalesce.
>
> A +
>
> HervéR a écrit:
> > Bonjour tout le monde,
> >
> > Je suis en train d'étudier le passage d'une bdd actuellement au niveau
de
> > compatibilité 65 au niveau 80.
> > Ce qui m'embête le plus, c'est le fait qu'en 80, l'option
> > CONCAT_NULL_YIELDS_NULL soit par défaut positionnée sur ON.
> > Ce qui fait que la requête
> > select null + 'coucou'
> > renvoie
> > NULL
> > J'ai essayé de modifier ce paramètre pour la base de données, mais ce


la
ne
> > fonctionne pas :(
> > Voici comment j'ai procédé :
> > Use Master
> > Go
> > Alter Database MaBase
> > Set CONCAT_NULL_YIELDS_NULL OFF
> > Go
> >
> > Un
> > Select DATABASEPROPERTYEX ('MaBase', 'IsNullConcat')
> > me renvoie pourtant bien 0
> > mais un
> > Use MaBase
> > select null + 'coucou'
> > renvoie hélàs toujours
> > NULL
> >
> > J'ai dû louper quelque chose, mais quoi ?
> >
> >
>
> --
> Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / Delphi / web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ************************ www.datasapiens.com *************************
>