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 :

Passer le nom de table comme parametre a une procedure stockée


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2009
    Messages : 86
    Points : 79
    Points
    79
    Par défaut Passer le nom de table comme parametre a une procedure stockée
    Bonjour ,
    Jai besoin de connaitre comment passer un nom du table a une procedure stocker comme parametre
    j'ai essyer mais ca marche pas aidez moi et merci d'avance
    voici mon example


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Create proc afficher (@Nom_Table varchar(80)
       as
        select * from  @Nom_Table

  2. #2
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous avez pour cela besoin d'utiliser du code SQL dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE PROC afficher 
    	@Nom_Table SYSNAME
    AS
    BEGIN
    	DECLARE @sql NVARCHAR(64)
    	SET @sql = 'SELECT mesColonnes FROM dbo.' + @Nom_Table
     
    	EXEC sp_executeSQL @sql
    END
    @++

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Si ton query peut faire plus de 4000 caractère ou que tu tiens à faire du code le plus réutilisable possible, il manque une lettre dans ce que te propose elsuket.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE PROC afficher 
    	@Nom_Table SYSNAME
    AS
    BEGIN
    	DECLARE @sql NVARCHAR(64)
    	SET @sql = N'SELECT mesColonnes FROM dbo.' + @Nom_Table
    
    	EXEC sp_executeSQL @sql
    END
    Most Valued Pas mvp

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Points : 17
    Points
    17
    Par défaut
    bonjour a tous,en faite, j ai presque le meme probleme que djouk, mais le mien est le suivant:
    je dois ecrire une procedure qui copie entierement les donnees et la syntaxe d une table dans une autre table. cette procedure doit prendre en entree les noms des 2 tables. voici mon code si ca peut vous aider

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    -- Verify that the stored procedure does not exist.
    IF OBJECT_ID ('usp_GetErrorInfo', 'P') IS NOT NULL
        DROP PROCEDURE usp_GetErrorInfo;
    GO
    -- Create procedure to retrieve error information.
    Create PROCEDURE usp_GetErrorInfo
    AS
        SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() as ErrorState,
            ERROR_PROCEDURE() as ErrorProcedure,
            ERROR_LINE() as ErrorLine,
            ERROR_MESSAGE() as ErrorMessage;
    GO
     
    CREATE PROCEDURE COPIE_table @source varchar(50), @destination varchar (50)
    as
     
     begin try
       if NOT EXISTS (Select * from sysobjects where name = @source and Xtype='U' )--Permet de savoir si une table 'source' existe dans notre base de données 
         BEGIN
           print 'table source pas dispo'
         END
       else
         BEGIN
           if NOT EXISTS(Select * from sysobjects where name= @destination and Xtype='U' )
               BEGIN
     
                 select * into  @destination from @source
                 print 'kopie reussie'
               END 
     
           else
             BEGIN
               if exists (select * from @destination)
                 BEGIN
                  delete from @ziel
                  select * into @ziel from @source
                  print 'kopie reussie'
                 END
               else
                  BEGIN
     
                 select * into  @destination from @source
                 print 'kopie reussie'
                  END
     
             END
     end try
     begin catch
       execute usp_GetErrorInfo
      end catch
     
    GO
    mais j ai les erreurs du genre

    Msg 102, Level 15, State 1, Procedure COPIE_table, Line 15
    Incorrect syntax near '@destination'.
    Msg 1087, Level 15, State 2, Procedure COPIE_table, Line 21
    Must declare the table variable "@destination".
    Msg 1087, Level 15, State 2, Procedure COPIE_table, Line 23
    Must declare the table variable "@destination".
    Msg 102, Level 15, State 1, Procedure COPIE_table, Line 24
    Incorrect syntax near '@destination'.
    Msg 156, Level 15, State 1, Procedure COPIE_table, Line 27
    Incorrect syntax near the keyword 'else'.
    Msg 102, Level 15, State 1, Procedure COPIE_table, Line 29
    Incorrect syntax near '@destination'.
    Msg 102, Level 15, State 1, Procedure COPIE_table, Line 35
    Incorrect syntax near 'begin'.
    s il vous plait aidez moi, je suis la dessus depuis tres longtemps

    merci de votre aide

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2009
    Messages : 86
    Points : 79
    Points
    79
    Par défaut
    merciiiiiiiiiiii ca marché

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Besoin de détails
    je n'ai pas bien saisi ce que vous avez fait au juste pour débloquer votre situation, j'ai le même problème mais la solution semble pas proposée
    thx

  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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Donnez votre code, que nous puissions vous aider

    @++

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Probleme pour passer le nom d'une Table en paramètre de ma procedure stockée
    Bonjour,

    j'ai un probleme pour passer le nom d'une Table en paramètre de ma procedure stockée sur SQL server 2005.

    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
    40
    USE [Guerbet_Lanester]
    GO
    /****** Objet*: StoredProcedure [dbo].[Maj_FMA] Date de génération du script*: 01/06/2010 16:28:26 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    ALTER PROCEDURE [dbo].[Maj_FMA]
        @Table SYSNAME, 
        @Trig int,
        @Lots nvarchar(50),
        @Mesure real,
        @Tache real,
        @Phase real,
        @Id reaL
     
    AS
        DECLARE @Un int, @zero int, @Sql1 nvarchar(1000), @Sql2 nvarchar(1000)
     
        SET @zero=0
        SET @Un=1
     
        IF @Trig=0                        /* SUR FRONT DESCENDANT DU TRIGGER */
            BEGIN
     
            SET @sql1 = 'UPDATE ' + @Table + ' SET ' + @Table + '.MesureFin = ' + @Mesure + ',' + @Table + '.id = ' + @zero + ' FROM' + @Table + ' WHERE (' + @Table + '.id = ' + @Un +');'
            EXEC spexecuteSQL @sql1    
     
            END
        ELSE                            /* SUR FRONT MONTANT DU TRIGGER */
     
            BEGIN
            SET NOCOUNT ON
            SET @sql2 = 'INSERT INTO ' + @Table + '(Num_Lot,MesureDeb,Tache,Phase,id) SELECT ' + @Lots + ' AS Expr1, '+ @Mesure + ' AS Expr2,' + @Tache + ' AS Expr3,' + @Phase + ' AS Expr4,' + @Un + ' AS Expr5;'
            EXEC spexecuteSQL @sql2
     
        END
     
    RETURN

    Msg*8114, Niveau*16, État*5, Procédure*Maj_FMA, Ligne*28
    Erreur de conversion du type de données nvarchar en real.
    Merci pour votre aide

  9. #9
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Faites simple :

    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
    ALTER PROCEDURE Maj_FMA
    	@Table SYSNAME,
    	@Trig int,
    	@Lots NVARCHAR(50),
    	@Mesure REAL,
    	@Tache REAL,
    	@Phase REAL,
    	@Id REAL
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @sql NVARCHAR(1024)
     
    	-- SUR FRONT DESCENDANT DU TRIGGER
    	IF @Trig = 0
    	BEGIN
    		SET @sql = 'UPDATE dbo.'  + @Table +
    					' SET MesureFin = ' + CAST(@Mesure AS VARCHAR(15) + ',' +
    					' id = 0 WHERE id = 1'
    	END
    	ELSE  -- SUR FRONT MONTANT DU TRIGGER
    	BEGIN
    		SET @sql = 'INSERT INTO dbo.' + @Table + '(Num_Lot,MesureDeb,Tache,Phase,id)' +
    					' VALUES (' + @Lots + ', '+
    								CAST(@Mesure AS VARCHAR(15) + ', ' +
    								CAST(@Tache AS VARCHAR(15) + ', ' +
    								CAST(@Phase AS VARCHAR(15) + ', 1)'
    	END
     
    	EXEC sp_executeSQL @sql
    END
    Votre problème vient du fait que vous essayez de transtyper directement une valeur de type REAL au type chaîne de caractères, ce qui ne peut pas se faire implicitement comme le montre la matrice de conversions implicites.

    Quand vous contruisez la requête, vous passez au moteur de base de données la requête elle-même, donc une chaîne de caractères.
    Donc vous devez transtyper toutes les valeurs qui n'ont pas le type chaîne de caractère vers ce type

    Autres remarques qui ne sont pas en relation avec votre problème :

    - qualifiez toujours le nom de vos objets par le nom du schéma auquel ils appartiennent, vous y gagnerez en performances
    - un UPDATE n'a besoin de la clause FROM que s'il spécifie au moins deux tables, c'est à dire qu'il nécessite une jointure, ce qui n'a pas l'air d'être votre cas.
    Comme un UPDATE n'a lieu que sur une seule table, qualifier les colonnes à mettre à jour (partie gauche de l'égalité) par le nom de la table est inutile.
    - RETURN n'est nécessaire que pour interrompre l'exécution d'une procédure stockée. Vous n'en avez donc pas besoin ici
    - Vous avez utilisé des types de données pour des nombres à virgule flottante, mais est-ce bien là votre besoin ? sachez que cela implique des erreurs de calcul, que ce soit de l'arithmétique simple ou des agrégats.

    @++

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Sawa di cap
    Merci beaucoup pour ton aide elsuket.

    C'est ok.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passer un nom de table en parametre
    Par fred19732 dans le forum Développement
    Réponses: 2
    Dernier message: 14/01/2011, 23h32
  2. Réponses: 2
    Dernier message: 30/12/2008, 18h07
  3. Réponses: 8
    Dernier message: 15/11/2007, 09h05
  4. Réponses: 20
    Dernier message: 22/03/2005, 21h07
  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