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" ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <gilles.tourreau@pos.fr> a écrit dans le message de news:
mn.6d5c7d641c1a1712.52180@pos.fr...
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"
?
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
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 ***********************
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 ***********************
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 ***********************
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
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" <gilles.tourreau@pos.fr> a écrit dans le message de news:
mn.6d5c7d641c1a1712.52180@pos.fr...
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" ?
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
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 ***********************
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 ***********************
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 ***********************
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
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" <gilles.tourreau@pos.fr> a écrit dans le message de news:
mn.723c7d644a4157b5.52180@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 ?
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