OVH Cloud OVH Cloud

Curseur avec une requête "dynamique"

5 réponses
Avatar
Gilles TOURREAU
Bonjour tout le monde !

Je souhaite faire un parcours d'une table dans une procédure stocké. Ne
connaissant pas le nom de la table, celle ci est passé comme paramètre
à la procédure.

J'écris donc procédure de telle façon

CREATE PROCEDURE Proc
@nomTable NVARCHAR(30),
...
AS
BEGIN
...
DECLARE @sql NVARCHAR(1000);
...
SET @sql = N'SELECT Rub1, Rub2 FROM ' + @nomTable;

DECLARE curLigne CURSOR FOR
SELECT @sql;
...
FETCH curLigne INTO @rub1, @rub2;
...
END

J'appel alors ma prcoédure et j'ai le message d'erreur suivant :

Msg 16924, Level 16, State 1, Procedure PassageEuro, Line 43
Cursorfetch: The number of variables declared in the INTO list must
match that of selected columns.

D'où vient cette erreur ?
Existe t'il un autre moyen de parcourir une requête créer
"dynamiquement" ?

En vous remerciant par avance de vos lumières

--
Gilles TOURREAU
Responsable informatique
gilles.tourreau@pos.fr

Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr

5 réponses

Avatar
Romelard Fabrice [MVP]
Bonsoir,

Tu peux t'inspirer de cet exemple ci :
-
http://www.sqlfr.com/codes/SQL-SERVER-PROCEDURE-STOCKEE-PERMETTANT-DEFRAGMENTERTOUS-INDEXES-TOUTES_36635.aspx

--
Cordialement.

Romelard Fabrice [MVP]

"Gilles TOURREAU" a écrit dans le message de news:

Bonjour tout le monde !

Je souhaite faire un parcours d'une table dans une procédure stocké. Ne
connaissant pas le nom de la table, celle ci est passé comme paramètre à
la procédure.

J'écris donc procédure de telle façon

CREATE PROCEDURE Proc
@nomTable NVARCHAR(30),
...
AS
BEGIN
...
DECLARE @sql NVARCHAR(1000);
...
SET @sql = N'SELECT Rub1, Rub2 FROM ' + @nomTable;

DECLARE curLigne CURSOR FOR
SELECT @sql;
...
FETCH curLigne INTO @rub1, @rub2;
...
END

J'appel alors ma prcoédure et j'ai le message d'erreur suivant :

Msg 16924, Level 16, State 1, Procedure PassageEuro, Line 43
Cursorfetch: The number of variables declared in the INTO list must match
that of selected columns.

D'où vient cette erreur ?
Existe t'il un autre moyen de parcourir une requête créer "dynamiquement"
?

En vous remerciant par avance de vos lumières

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr




Avatar
SQLpro [MVP]
Gilles TOURREAU a écrit :
Bonjour tout le monde !

Je souhaite faire un parcours d'une table dans une procédure stocké. Ne
connaissant pas le nom de la table, celle ci est passé comme paramètre à
la procédure.

J'écris donc procédure de telle façon

CREATE PROCEDURE Proc
@nomTable NVARCHAR(30),
...
AS
BEGIN
...
DECLARE @sql NVARCHAR(1000);
...
SET @sql = N'SELECT Rub1, Rub2 FROM ' + @nomTable;

DECLARE curLigne CURSOR FOR
SELECT @sql;
...
FETCH curLigne INTO @rub1, @rub2;
...
END

J'appel alors ma prcoédure et j'ai le message d'erreur suivant :

Msg 16924, Level 16, State 1, Procedure PassageEuro, Line 43
Cursorfetch: The number of variables declared in the INTO list must
match that of selected columns.

D'où vient cette erreur ?
Existe t'il un autre moyen de parcourir une requête créer "dynamiquement" ?

En vous remerciant par avance de vos lumières





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Gilles TOURREAU
Romelard Fabrice [MVP] vient de nous annoncer :
Bonsoir,

Tu peux t'inspirer de cet exemple ci :
-
http://www.sqlfr.com/codes/SQL-SERVER-PROCEDURE-STOCKEE-PERMETTANT-DEFRAGMENTERTOUS-INDEXES-TOUTES_36635.aspx

--
Cordialement.

Romelard Fabrice [MVP]

"Gilles TOURREAU" a écrit dans le message de news:

Bonjour tout le monde !

Je souhaite faire un parcours d'une table dans une procédure stocké. Ne
connaissant pas le nom de la table, celle ci est passé comme paramètre à la
procédure.

J'écris donc procédure de telle façon

CREATE PROCEDURE Proc
@nomTable NVARCHAR(30),
...
AS
BEGIN
...
DECLARE @sql NVARCHAR(1000);
...
SET @sql = N'SELECT Rub1, Rub2 FROM ' + @nomTable;

DECLARE curLigne CURSOR FOR
SELECT @sql;
...
FETCH curLigne INTO @rub1, @rub2;
...
END

J'appel alors ma prcoédure et j'ai le message d'erreur suivant :

Msg 16924, Level 16, State 1, Procedure PassageEuro, Line 43
Cursorfetch: The number of variables declared in the INTO list must match
that of selected columns.

D'où vient cette erreur ?
Existe t'il un autre moyen de parcourir une requête créer "dynamiquement" ?

En vous remerciant par avance de vos lumières

-- Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr







Merci c'est exactement ce que je cherchais !

En fait si j'ai bien compris, EXEC() permet de faire une évalutation de
chaine ? Un peu comme eval() en JavaScript ?

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
SQLpro [MVP]
Gilles TOURREAU a écrit :
Bonjour tout le monde !

Je souhaite faire un parcours d'une table dans une procédure stocké. Ne
connaissant pas le nom de la table, celle ci est passé comme paramètre à
la procédure.

J'écris donc procédure de telle façon

CREATE PROCEDURE Proc
@nomTable NVARCHAR(30),
...
AS
BEGIN
...
DECLARE @sql NVARCHAR(1000);
...
SET @sql = N'SELECT Rub1, Rub2 FROM ' + @nomTable;

DECLARE curLigne CURSOR FOR
SELECT @sql;
...
FETCH curLigne INTO @rub1, @rub2;
...
END

J'appel alors ma prcoédure et j'ai le message d'erreur suivant :

Msg 16924, Level 16, State 1, Procedure PassageEuro, Line 43
Cursorfetch: The number of variables declared in the INTO list must
match that of selected columns.



Normal un paramètre ne peut représenter qu'une valeur et non un objet.
Un nom de table est un objet de la base.

Pour réaliser cela il faut du sql dynamique.
Voici un exemple d'implémentation d'un curseur en SQL dynamique :


DECLARE @my_cur CURSOR
EXEC sp_executesql
N'SET @my_cur = CURSOR FOR SELECT name FROM dbo.sysobjects; OPEN
@my_cur', N'@my_cur cursor OUTPUT', @my_cur OUTPUT
FETCH NEXT FROM @my_cur

...


D'où vient cette erreur ?
Existe t'il un autre moyen de parcourir une requête créer "dynamiquement" ?

En vous remerciant par avance de vos lumières




A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Arnaud CLERET
Oui tout à fait.

Vous pouvez aussi utiliser sp_executeSql qui permet d'exécuter des requêtes
dynamiques tout en profitant de l'optimiseur de requêtes qui peut réutiliser
le plan d'exécution généré lors d'une première exécution.

--
arno - http://www.dotnetguru2.org/acleret/

"Gilles TOURREAU" a écrit dans le message de news:



Merci c'est exactement ce que je cherchais !

En fait si j'ai bien compris, EXEC() permet de faire une évalutation de
chaine ? Un peu comme eval() en JavaScript ?

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr