OVH Cloud OVH Cloud

Niveau d'imbrication

4 réponses
Avatar
Jean-Nicolas BERGER
Bonjour,

Est-ce que quelqu'un saurait m'expliquer pourquoi
sp_executesql N'select @@nestlevel'
retourne 2 alors que
exec ('select @@nestlevel')
retourne 1?

Merci d'avance.
JN BERGER

4 réponses

Avatar
hch
bonjour

@@nestlevel est une variable qui vous donne le niveau d'imbrication de la
procedure stockée en cours d'execution !!!

Lorsque vous executez sp_execute ....... (c'est une procedure a 2 niveaux
d'imbrication) l'autre exec (select @@nestlevel) est a 1 seul niveau
d'imbrication

les niveaux d'imbrication ds les sp de sql server sont limités a 32 !!!

essayez ce code vous allez tout de suite comprendre ce qui vous arrive

*******************

Cet exemple crée deux procédures : une qui appelle l'autre et une qui
affiche le paramètre @@NESTLEVEL de chacune d'entre elles.

CREATE PROCEDURE innerproc as
select @@NESTLEVEL AS 'Inner Level'
GO

CREATE PROCEDURE outerproc as
select @@NESTLEVEL AS 'Outer Level'
EXEC innerproc
GO

EXECUTE outerproc
GO
Voici le jeu de résultats obtenu :

Outer Level
-----------------
1

Inner Level
-----------------
2

**********************************************************

hch

"Jean-Nicolas BERGER" a écrit :

Bonjour,

Est-ce que quelqu'un saurait m'expliquer pourquoi
sp_executesql N'select @@nestlevel'
retourne 2 alors que
exec ('select @@nestlevel')
retourne 1?

Merci d'avance.
JN BERGER





Avatar
Med Bouchenafa
Très bonne découverte !!!
Cela montre effectivement de belle manière le comportement des trois modes
SELECT @@nestlevel
EXEC ('SELECT @@nestlevel')
EXEC sp_executesql N'SELECT @@nestlevel'

Cela demontre aussi de façon irréfutable que sp_executesql appelle en
interne une autre porcédure.

--
Bien cordialement
Med Bouchenafa

"Jean-Nicolas BERGER" a écrit dans
le message de news:
Bonjour,

Est-ce que quelqu'un saurait m'expliquer pourquoi
sp_executesql N'select @@nestlevel'
retourne 2 alors que
exec ('select @@nestlevel')
retourne 1?

Merci d'avance.
JN BERGER



Avatar
hch
cela montre aussi que lorsqu'on veut utiliser une SP systeme ou autre de sql
a inclure dans une procedure stockée perso il vaut mieux aller tester le
niveau d'imbrication et s'il est superieur a 1 faut se poser la question des
performances!!!!!

Bon travail

"Med Bouchenafa" a écrit :

Très bonne découverte !!!
Cela montre effectivement de belle manière le comportement des trois modes
SELECT @@nestlevel
EXEC ('SELECT @@nestlevel')
EXEC sp_executesql N'SELECT @@nestlevel'

Cela demontre aussi de façon irréfutable que sp_executesql appelle en
interne une autre porcédure.

--
Bien cordialement
Med Bouchenafa

"Jean-Nicolas BERGER" a écrit dans
le message de news:
> Bonjour,
>
> Est-ce que quelqu'un saurait m'expliquer pourquoi
> sp_executesql N'select @@nestlevel'
> retourne 2 alors que
> exec ('select @@nestlevel')
> retourne 1?
>
> Merci d'avance.
> JN BERGER
>





Avatar
Jean-Nicolas BERGER
> Cela demontre aussi de façon irréfutable que sp_executesql appelle en
interne une autre porcédure.




C'est vrai, mais étrange à la fois. En effet, de la part d'une procédure
native (dont le code est invisible au sp_helptext), on aurait pu s'attendre à
un traitement direct, en ne prenant qu'un niveau d'imbrication au lieu de 2 !

JN.