IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Passage d un nom de table en paramètre d'une procédure stockée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut Passage d un nom de table en paramètre d'une procédure stockée
    Bonjour,
    j'ai un problème que je n'arrive aps a résoudre. J'ai une procédure stockée. Il faudrait que je lui passe en paramèetre le nom de la table sur laquelle je fais le sélect.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE PROCEDURE MaProc 
    	-- Add the parameters for the stored procedure here
    	@NOMTABLE varchar(50)
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	select * from @NOMTABLE
    END
    GO
    Mais je prends l'erreur La variable de table "@NOMTABLE" doit être déclarée.. Le problème est que la structure de la table à traiter n'est pas toujours la même...
    Si qu'elqu'un a une idée
    Merci beaucoup
    Cédric

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    ça m'a tout l'air d'être du SQL Server...

    Ta première erreur est d'oublier les parenthèses, la seconde de ne pas utiliser EXEC... Voici une version corrigée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE dbo.MaProc (@NOMTABLE VARCHAR(50)) 
    AS
    DECLARE @SQL VARCHAR(255) ;
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	SET @SQL = 'SELECT * FROM ' + @NOMTABLE ;
    	EXEC (@SQL) ;
    END

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Merci pour ta réponse. Effectivement c'est bien du SQL Server
    Ca marche mais en fait je veux aller plus loin. Je veux mettre le résultat de la requête éxécutée dans la précédure dans une variable. Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    SET ANSI_NULLS ON
    GO
    CREATE PROCEDURE RecupeListe
    	@NOM_TABLE VARCHAR(128),
    	@ID int
    AS
    BEGIN
    	SET NOCOUNT ON;
    	DECLARE @MA_REQUETE VARCHAR(8000)
    	declare @SAVEID int
    	set @SAVEID = 0
    	PRINT @ID
    	  WHILE @SAVEID > -1 --@ID <> @SAVEID
    	  BEGIN
    			SET @MA_REQUETE = 'Select @SAVEID  =  COLID from ' + @NOM_TABLE + ' where GENE = ' + CONVERT(Varchar(50),@ID)
    			PRINT @MA_REQUETE
    			EXEC (@MA_REQUETE)
    			  IF @ID = @SAVEID
    					  BREAK;
    			  else
    				set @SAVEID = @ID
    			PRINT @ID
    		END
    END
     
    GO
    Et en l'éxécutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXEC RecupeListe @NOM_TABLE = 'LIEU', @ID = 3
    j'ai le message suivante


    Select @SAVEID = COLID from LIEU where GENE = 3
    Msg*137, Niveau*15, État*1, Ligne*1
    La variable scalaire "@SAVEID" doit être déclarée.

    Select @SAVEID = COLID from LIEU where GENE = 3
    Msg*137, Niveau*15, État*1, Ligne*1
    La variable scalaire "@SAVEID" doit être déclarée.


    Désolé je ne suis pas un expert des procédures stockées

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Quand tu exécutes une chaîne SQL avec EXEC, elle l'est dans un contexte différent, et du coup elle ne connaît pas les variables déclarées dans ta proc stock, et réciproquement.

    Peux-tu m'expliquer ton jeu sur @ID et @SAVE_ID ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Par défaut
    Pardon mon code est faux. En fait je veux récupérer la hiérarchie d'un lieu.
    Dans l'idée c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SET ANSI_NULLS ON
    GO
    CREATE PROCEDURE RecupeListe
    	@NOM_TABLE VARCHAR(128),
    	@ID int
    AS
    BEGIN
    	SET NOCOUNT ON;
    	DECLARE @MA_REQUETE VARCHAR(8000)
    	PRINT @ID
    	  WHILE @ID != NULL
    	  BEGIN
    			SET @MA_REQUETE = 'Select @ID  =  COLID from ' + @NOM_TABLE + ' where GENE = ' + CONVERT(Varchar(50),@ID)
    			PRINT @MA_REQUETE
    			EXEC (@MA_REQUETE)
    			  IF @ID = NULL
    					  BREAK;
    			PRINT @ID
    		END
    END
     
    GO
    Mais d'une part @ID != NULL me renvoie faux puisque je ne rentre pas dans la boucle, et d'autre part je n'arrive pas a affecter le résultat du SELECT dans la variable @ID
    Je sais pas si je suis tres clair...

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    D'une part, NULL ne marche jamais avec =, ni avec !=. D'autre part le contexte d'exécution de @MA_REQUETE n'est pas le même que celui de ta procédure, donc tu ne peux effectivement pas affecter. Enfin, pourquoi ne pas faire simplement ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE RecupeListe
    	@NOM_TABLE VARCHAR(128),
    	@ID int
    AS
    DECLARE @MA_REQUETE VARCHAR(8000)
    BEGIN
    	SET NOCOUNT ON;
    	SET @MA_REQUETE = 'Select COLID from ' + @NOM_TABLE + ' where GENE = ' + CONVERT(Varchar(50),@ID)
    	EXEC (@MA_REQUETE)
    END
    Ça te renvoie l'ID que tu cherches si elle est trouvée, un empty set sinon, il me semble que cela correspond à ce que tu attends avec ton IF @ID = NULL.

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Que se passera-t-il si votre requête SELECT dynamique retourne plusieurs lignes ?
    La variable @ID contiendra la valeur de la colonne de la 1e ligne de l'ensemble de résultats retourné par votre requête.
    Donc ce que vous avez écrit est faux

    Ce que vous pouvez faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    CREATE PROCEDURE RecupeListe
    	@NOM_TABLE VARCHAR(128),
    	@ID int
    AS
    BEGIN
    	SET NOCOUNT ON;
    	DECLARE @MA_REQUETE VARCHAR(8000)
    	PRINT @ID
    	WHILE @ID != NULL
    	BEGIN
    		SET @MA_REQUETE = 'Select COLID from ' + @NOM_TABLE + ' where GENE = ' + CONVERT(VARCHAR(50),@ID)
    		PRINT @MA_REQUETE
     
    		DECLARE @TbID TABLE
    		(
    			ID INT
    		)
     
    		-- Récupère le résultat de la requête dans @TbID
    		INSERT INTO @TbID
    		EXEC (@MA_REQUETE)
     
    		-- Si la colonne COLID de la table @NOM_TABLE contient des NULL
    		IF EXISTS
    		(
    			SELECT *
    			FROM @TbID
    			WHERE ID IS NULL
    		)
    		BREAK;
     
    		-- Liste les valeurs contenues dans la table @TbID (<=> COLID de la table @NOM_TABLE)
    		DECLARE @szMsg VARCHAR(256)
    		SELECT @szMsg = ISNULL(@szMsg, '') + CAST(ISNULL(ID, '<NULL>') AS VARCHAR) + ','
    		FROM @TbID
     
    		PRINT @szMsg
    	END
    END
    Mais je ne vois pas l'intérêt de ce code.
    Que cherchez vous à faire exactement ?

    @++

Discussions similaires

  1. [MySQL-5.1] Passer le nom d'une table en paramètre d'une procédure
    Par boubanet dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 08/06/2014, 18h06
  2. Réponses: 11
    Dernier message: 22/05/2014, 11h45
  3. Réponses: 9
    Dernier message: 11/01/2010, 10h30
  4. Réponses: 4
    Dernier message: 14/02/2006, 15h33
  5. Passer le nom de colonne en paramètre d'une procédure stocké
    Par theartist dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/01/2005, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo