OVH Cloud OVH Cloud

Curseurs et variables

6 réponses
Avatar
OokieDookie
Bonjour à tous,

Je rédige un script afin de contrôler le nombre de lignes rapatriées par un
ETL (effectué via DTS). Pour cela j'utilise deux tables (une pour les bases,
l'autres pour les tables) et deux curseurs.

Lorsque j'essaie d'affecter une valeur à une de mes variables dans mes
boucles while, j'ai le message d'erreur suivant, alors que la vérification de
la syntaxe passe bien :
Serveur : Msg 137, Niveau 15, État 1, Ligne 1
La variable '@NBLIGSCE' doit être déclarée.

Pour faire bref, cela ressemble un peu à

DECLARE @TABLE, @BDD, @NBLIGSCE, @NBLIGDESC, @STR1, @STR2....

DECLARE C CURSOR..... MESTABLES
..

DECLARE D CURSOR.... MES BASES


WHILE ...
BEGIN
SET STR1 = 'SET @NBLIGSCE = (SELECT COUNT(*) FROM ' + @BDD + '.dbo.' +
@TABLE+ ')'
EXEC (@STR1)

...


Et c'est à ce point que j'obtiens le message. La doc T-SQL dit que le
contexte de BDD n'est valable que jusqu'à la fin d'EXECUTE. Cela
s'applique-t-il également aux variables ? Comment contourner cette difficulté
?

D'avance merci.

6 réponses

Avatar
BVesan
Bonjour,
vous ne pouvez effectivement pas utiliser de variable dans votre EXECUTE à
moins que celle-ci ne soit aussi définie dans l'EXECUTE lui même...
Une solution assez simple pour contourner le problème est de passer par une
table de résultat


DECLARE @table_resultat TABLE(col1 int)

INSERT INTO @table_resultat
EXECUTE (@STR1)

SELECT @NBLIGSCE = col1 FROM @table_resultat.



Benjamin
Avatar
Laurent Jordi
Salut,

Pas sur d'avoir raison, mais les variable de ta proc ne peuvent pas être
utilisée dans EXEC qui s'exécute dans un espace mémoire indépendant...

Si j'étais toi, je mettrais l'interrogation dynamique de la table dans une
fonction et je récupèrerais le résultat dans la variable...

@+

Laurent



"OokieDookie" a écrit dans le message de news:

Bonjour à tous,

Je rédige un script afin de contrôler le nombre de lignes rapatriées par
un
ETL (effectué via DTS). Pour cela j'utilise deux tables (une pour les
bases,
l'autres pour les tables) et deux curseurs.

Lorsque j'essaie d'affecter une valeur à une de mes variables dans mes
boucles while, j'ai le message d'erreur suivant, alors que la vérification
de
la syntaxe passe bien :
Serveur : Msg 137, Niveau 15, État 1, Ligne 1
La variable '@NBLIGSCE' doit être déclarée.

Pour faire bref, cela ressemble un peu à

DECLARE @TABLE, @BDD, @NBLIGSCE, @NBLIGDESC, @STR1, @STR2....

DECLARE C CURSOR..... MESTABLES
..

DECLARE D CURSOR.... MES BASES


WHILE ...
BEGIN
SET STR1 = 'SET @NBLIGSCE = (SELECT COUNT(*) FROM ' + @BDD + '.dbo.' +
@TABLE+ ')'
EXEC (@STR1)

...


Et c'est à ce point que j'obtiens le message. La doc T-SQL dit que le
contexte de BDD n'est valable que jusqu'à la fin d'EXECUTE. Cela
s'applique-t-il également aux variables ? Comment contourner cette
difficulté
?

D'avance merci.



Avatar
OokieDookie
Merci de votre aide.

Désolé cependant, j'obtiens le message suivant :
Impossible d'utiliser EXECUTE comme source lors de l'insertion dans une
variable de table.

De plus, s'il faut passer par une table de résultat (idée par ailleurs très
séduisante, il faudra que je gère trois colonnes (tablesql, nbligsce et
nbligdesc), ce qui suppose donc l'utilisation de deux instructions EXEC lors
de l'insertion de mes valeurs, ce qui apparemment n'est pas possible (ou
alors j'ai raté quelque chose lors de l'implémentation de la table de
résultat dans mon script).

Je n'aime pas beaucoup recourir à ce genre d'extrémités, mais si besoin je
pourrais publier mon code (2 Ko, je ne sais pas si cela se fait sur ce
newsgroup) ;)

Encore merci de votre aide


"BVesan" a écrit :

Bonjour,
vous ne pouvez effectivement pas utiliser de variable dans votre EXECUTE à
moins que celle-ci ne soit aussi définie dans l'EXECUTE lui même...
Une solution assez simple pour contourner le problème est de passer par une
table de résultat


DECLARE @table_resultat TABLE(col1 int)

INSERT INTO @table_resultat
EXECUTE (@STR1)

SELECT @NBLIGSCE = col1 FROM @table_resultat.



Benjamin


Avatar
Laurent Jordi
Pourquoi ne pas utiliser les tables systèmes ? je suis certain que ces
informations doivent être dispo quelque part...
Il resterait juste à savoir où :)

@+


Genre select
"Laurent Jordi" <laurent.jordi@(xxx)wanadoo.fr> a écrit dans le message de
news:
Salut,

Pas sur d'avoir raison, mais les variable de ta proc ne peuvent pas être
utilisée dans EXEC qui s'exécute dans un espace mémoire indépendant...

Si j'étais toi, je mettrais l'interrogation dynamique de la table dans une
fonction et je récupèrerais le résultat dans la variable...

@+

Laurent



"OokieDookie" a écrit dans le message de news:

Bonjour à tous,

Je rédige un script afin de contrôler le nombre de lignes rapatriées par
un
ETL (effectué via DTS). Pour cela j'utilise deux tables (une pour les
bases,
l'autres pour les tables) et deux curseurs.

Lorsque j'essaie d'affecter une valeur à une de mes variables dans mes
boucles while, j'ai le message d'erreur suivant, alors que la
vérification de
la syntaxe passe bien :
Serveur : Msg 137, Niveau 15, État 1, Ligne 1
La variable '@NBLIGSCE' doit être déclarée.

Pour faire bref, cela ressemble un peu à

DECLARE @TABLE, @BDD, @NBLIGSCE, @NBLIGDESC, @STR1, @STR2....

DECLARE C CURSOR..... MESTABLES
..

DECLARE D CURSOR.... MES BASES


WHILE ...
BEGIN
SET STR1 = 'SET @NBLIGSCE = (SELECT COUNT(*) FROM ' + @BDD + '.dbo.' +
@TABLE+ ')'
EXEC (@STR1)

...


Et c'est à ce point que j'obtiens le message. La doc T-SQL dit que le
contexte de BDD n'est valable que jusqu'à la fin d'EXECUTE. Cela
s'applique-t-il également aux variables ? Comment contourner cette
difficulté
?

D'avance merci.







Avatar
OokieDookie
Effectivement je suis entièrement d'accord.
Disons simplement que j'essaie de me simplifier la vie dans un premier temps
en prenant une liste de valeurs prédéfinies (établie à partir du systables
d'une base exemple), je ne consolide qu'une partie des tables existantes et
je ne peux les modifier (exploitation par un logiciel tiers).


"Laurent Jordi" a écrit :

Pourquoi ne pas utiliser les tables systèmes ? je suis certain que ces
informations doivent être dispo quelque part...
Il resterait juste à savoir où :)

@+


Genre select
"Laurent Jordi" <laurent.jordi@(xxx)wanadoo.fr> a écrit dans le message de
news:
> Salut,
>
> Pas sur d'avoir raison, mais les variable de ta proc ne peuvent pas être
> utilisée dans EXEC qui s'exécute dans un espace mémoire indépendant...
>
> Si j'étais toi, je mettrais l'interrogation dynamique de la table dans une
> fonction et je récupèrerais le résultat dans la variable...
>
> @+
>
> Laurent
>
>
>
> "OokieDookie" a écrit dans le message de news:
>
>> Bonjour à tous,
>>
>> Je rédige un script afin de contrôler le nombre de lignes rapatriées par
>> un
>> ETL (effectué via DTS). Pour cela j'utilise deux tables (une pour les
>> bases,
>> l'autres pour les tables) et deux curseurs.
>>
>> Lorsque j'essaie d'affecter une valeur à une de mes variables dans mes
>> boucles while, j'ai le message d'erreur suivant, alors que la
>> vérification de
>> la syntaxe passe bien :
>> Serveur : Msg 137, Niveau 15, État 1, Ligne 1
>> La variable '@NBLIGSCE' doit être déclarée.
>>
>> Pour faire bref, cela ressemble un peu à
>>
>> DECLARE @TABLE, @BDD, @NBLIGSCE, @NBLIGDESC, @STR1, @STR2....
>>
>> DECLARE C CURSOR..... MESTABLES
>> ..
>>
>> DECLARE D CURSOR.... MES BASES
>>
>>
>> WHILE ...
>> BEGIN
>> SET STR1 = 'SET @NBLIGSCE = (SELECT COUNT(*) FROM ' + @BDD + '.dbo.' +
>> @TABLE+ ')'
>> EXEC (@STR1)
>>
>> ...
>>
>>
>> Et c'est à ce point que j'obtiens le message. La doc T-SQL dit que le
>> contexte de BDD n'est valable que jusqu'à la fin d'EXECUTE. Cela
>> s'applique-t-il également aux variables ? Comment contourner cette
>> difficulté
>> ?
>>
>> D'avance merci.
>>
>
>





Avatar
OokieDookie
Bonjour,

Effectivement, une fois la bonne syntaxe rédigée, ça marche bien ;)
En fait au début j'essayais de déclarer la table dans mon EXECUTE, alors
qu'il fallait qu'elle soit déclarée avant l'ouverture des curseurs.

Pour info j'ai même réussi à utiliser sysdatabases et
INFORMATION_SCHEMA.tables, je suis comblé !

Merci encore pour votre aide. Ce forume est vraiment cool :)
Bonne journée à tous

"OokieDookie" a écrit :

Merci de votre aide.

Désolé cependant, j'obtiens le message suivant :
Impossible d'utiliser EXECUTE comme source lors de l'insertion dans une
variable de table.

De plus, s'il faut passer par une table de résultat (idée par ailleurs très
séduisante, il faudra que je gère trois colonnes (tablesql, nbligsce et
nbligdesc), ce qui suppose donc l'utilisation de deux instructions EXEC lors
de l'insertion de mes valeurs, ce qui apparemment n'est pas possible (ou
alors j'ai raté quelque chose lors de l'implémentation de la table de
résultat dans mon script).

Je n'aime pas beaucoup recourir à ce genre d'extrémités, mais si besoin je
pourrais publier mon code (2 Ko, je ne sais pas si cela se fait sur ce
newsgroup) ;)

Encore merci de votre aide


"BVesan" a écrit :

> Bonjour,
> vous ne pouvez effectivement pas utiliser de variable dans votre EXECUTE à
> moins que celle-ci ne soit aussi définie dans l'EXECUTE lui même...
> Une solution assez simple pour contourner le problème est de passer par une
> table de résultat
>
>
> DECLARE @table_resultat TABLE(col1 int)
>
> INSERT INTO @table_resultat
> EXECUTE (@STR1)
>
> SELECT @NBLIGSCE = col1 FROM @table_resultat.
>
>
>
> Benjamin