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

MS SQL Server Discussion :

Possibilité de passer le nom d’une table en variable ??


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Possibilité de passer le nom d’une table en variable ??
    Bonjour à tous,

    Je débute en SGBD et je suis confronté à un problème qui me bloque. En effet je n’arrive pas à passer le nom de la table en variable lors de requête SQL.

    Exemple 1

    declare @nom_table varchar(255)
    declare @valeur1 int
    set @nom_table varchar = 'test'
    insert @nom_table varchar (colonne1) values (@valeur1)
    Ms SQL m’indique que @nom_table n’est pas déclaré

    Exemple 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    declare @nom_table varchar(255)
    declare @valeur1 int
    set @nom_table varchar = 'test'
    exec('Insert '+@nom_table varchar+'(colonne1) values ('+@valeur1+')')
    cette fois c’est @valeur1 qui n’est pas déclaré. La commande exec fonctionne lorsque j’utilise une chaîne de caractère plus une variable, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec('drop table '+@nom_table)
    Voila où j’en suis dans mon investigation, si vous avez des idées, des remarques n’hésitez pas à en faire part.


    Merci d’avance

    Nicolas

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Sujet mainte fois traité
    cf sp_executesql

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut petite erreur
    Merci pour la piste fadasse ,

    Malgré mes recherches, je n’avais pas trouvé la réponse ne connaissant pas la commande « sp_executesql ». Donc j’ai pu avancer avec ton aide ,cependant j’ai une erreur récurrente : ‘Paramètre ‘@statement’ de type ‘ntext/nchar/nvarchar’ attendu par la procédure : .
    Voici le code utilisé :

    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
    56
    57
    58
    59
    60
    61
    62
    create procedure test ( 
    @NomCampagne varchar(255)) 
    AS
    BEGIN 
     
    declare @record_id int
    declare @contact_info varchar (128)
    declare @contact_info_type int
    declare @record_type int
    declare @record_status int
    declare @call_result int
    declare @attempt int
    declare @dial_sched_time int
    declare @call_time int
    declare @daily_from int
    declare @daily_till int
    declare @tz_dbid int
    declare @campaign_id int
    declare @agent_id varchar (32)
    declare @chain_id int
    declare @chain_n int
    declare @group_id int
    declare @app_id int 
    declare @treatments varchar (255)
    declare @media_ref int
    declare @email_subject varchar (255)
    declare @email_template_id int
    declare @switch_id int
    declare @crm_agent_name varchar (255)
    declare @crm_campaign_id varchar (20)
    declare @crm_camp_con_id varchar (20)
    declare @crm_contact_id varchar (20)
    declare @crm_contact_name  varchar (255)
    declare @crm_client_id varchar (40)
    declare @crm_client_name varchar (255)
    declare @crm_cancel varchar (255)
    declare @crm_dotc_name varchar (255)
    declare @crm_naf_name varchar (255)
    declare @crm_commune varchar (255)
    declare @crm_secteur varchar (255)
    declare @crm_affranchissement varchar (255)
    declare @crm_ca int
    declare @crm_nbr_opp int
    declare @SQLString varchar(255) 
    declare @ParmDefinition varchar(255) 
    declare Temp_curseur cursor for 
    select record_id, contact_info, contact_info_type, record_type, record_status, call_result, attempt,dial_sched_time, call_time, daily_from, daily_till, tz_dbid, campaign_id, agent_id,chain_id, chain_n,group_id, app_id,treatments, media_ref, email_subject, email_template_id, switch_id, crm_agent_name, crm_campaign_id, crm_camp_con_id, crm_contact_id, crm_contact_name, crm_client_id, crm_client_name, crm_cancel, crm_dotc_name, crm_naf_name, crm_commune, crm_secteur, crm_affranchissement, crm_ca, crm_nbr_opp 
    from Table_temp
     
     
    open Temp_curseur 
    fetch from Temp_curseur into @record_id, @contact_info, @contact_info_type, @record_type, @record_status, @call_result, @attempt, @dial_sched_time, @call_time, @daily_from, @daily_till, @tz_dbid, @campaign_id, @agent_id, @chain_id, @chain_n, @group_id, @app_id, @treatments, @media_ref, @email_subject, @email_template_id, @switch_id, @crm_agent_name, @crm_campaign_id, @crm_camp_con_id, @crm_contact_id, @crm_contact_name, @crm_client_id, @crm_client_name, @crm_cancel, @crm_dotc_name, @crm_naf_name, @crm_commune, @crm_secteur, @crm_affranchissement, @crm_ca, @crm_nbr_opp 
    	while (@@fetch_status = 0) 
    	begin 
    	set @ParmDefinition = N'@record_id int, @contact_info varchar(128), @contact_info_type int, @record_type int, @record_status int, @call_result int, @attempt int, @dial_sched_time int, @call_time int, @daily_from int, @daily_till int, @tz_dbid int, @campaign_id int, @agent_id varchar(32), @chain_id int, @chain_n int, @group_id int, @app_id int, @treatments varchar(255), @media_ref int, @email_subject varchar(255), @email_template_id int, @switch_id int, @crm_agent_name varchar(255), @crm_campaign_id varchar(20), @crm_camp_con_id varchar(20), @crm_contact_id varchar(20), @crm_contact_name varchar(255), @crm_client_id varchar(20), @crm_client_name varchar(255), @crm_cancel varchar(40), @crm_dotc_name varchar(255), @crm_naf_name varchar(255), @crm_commune varchar(255), @crm_secteur varchar(255), @crm_affranchissement varchar(255), @crm_ca int, @crm_nbr_opp int' 
    	execute sp_executesql @SQLString, @ParmDefinition, @NomCampagne 
    	fetch next from Temp_curseur into @record_id, @contact_info, @contact_info_type, @record_type, @record_status, @call_result, @attempt, @dial_sched_time, @call_time, @daily_from, @daily_till, @tz_dbid, @campaign_id, @agent_id, @chain_id, @chain_n, @group_id, @app_id, @treatments, @media_ref, @email_subject, @email_template_id, @switch_id, @crm_agent_name, @crm_campaign_id, @crm_camp_con_id, @crm_contact_id, @crm_contact_name, @crm_client_id, @crm_client_name, @crm_cancel, @crm_dotc_name, @crm_naf_name, @crm_commune, @crm_secteur, @crm_affranchissement, @crm_ca, @crm_nbr_opp 
    	end 
    close Temp_curseur 
    deallocate Temp_curseur 
    END 
    GO

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Vous ne devez passer qu'une chaîne de caractère comprenant un ordre SQL explicite à sp_executesql. Vous n'avez pas déterminé votre @sqlstring

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Suite...
    Bonjour,

    Je suis toujours confronté au même problème,
    Je dois pas prendre les choses dans l’ordre…

    Voici un exemple suivant :

    CREATE procedure test6

    AS
    BEGIN
    declare @NomCampagne varchar(255)
    set @NomCampagne='Campaign20'

    declare @agent_id varchar (32)

    declare Temp_curseur cursor for select agent_id from Table_temp


    open Temp_curseur
    fetch from Temp_curseur into @agent_id
    while (@@fetch_status = 0)
    begin

    set @SQLString = 'insert '+ @NomCampagne+'(agent_id) values @agent_id'
    exec sp_executesql @SQLString,N'@agent_id varchar(32)',@NomCampagne
    fetch next from Temp_curseur into @agent_id
    end
    close Temp_curseur
    deallocate Temp_curseur
    END
    GO





    Merci de votre patience et de votre indulgence,

    Cordialement,

    Nicolas

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 77
    Points : 90
    Points
    90
    Par défaut
    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
     
    CREATE procedure test6
     
    AS
    BEGIN
    declare @NomCampagne varchar(255)
    set @NomCampagne='Campaign20'
     
    declare @agent_id varchar (32)
     
    declare Temp_curseur cursor for select agent_id from Table_temp
     
     
    open Temp_curseur
    fetch Temp_curseur into @agent_id
    while (@@fetch_status = 0)
    begin
     
    set @SQLString = 'insert into '+ @NomCampagne+' (agent_id) values (' +@agent_id +')'
    exec (@SQLString)
     
    fetch Temp_curseur into @agent_id
    end
    close Temp_curseur
    deallocate Temp_curseur
    END
    GO
    et ça ça passe pas .... ?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Suite,Suite...
    Merci pour la réponse IG_Snoop,

    Je vais essayer d’effectuer la même opération pour des instructions de type :
    set @SQLString ='select '+@var_Table_destination+'=count(*) from '+@NomCampagne

    je continue à tester.

    Cordialement,

    Nicolas

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Suite,Suite,Suite...
    D’après les quelques essaies, il semble que cela fonction à condition que mes colonnes soient constituées de varchar et non de int car l'ensemble est mis dans une chaîne de caractère. J'ai essayé avec l'instruction convert mais cela ne semble pas fonctionner.

    Ainsi le code présenté par IG_Snoop fonctionne dans la mesure que la colonne "agent_ID" est constituée de varchar et non de int.

    je continue de chercher un moyen de contournement.

    Cordialement,

    Nicolas

  9. #9
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut Re: Suite,Suite,Suite...
    Citation Envoyé par nicolas310380
    Ainsi le code présenté par IG_Snoop fonctionne dans la mesure que la colonne "agent_ID" est constituée de varchar et non de int.
    Il vous suffit de Caster le champs de type Int en Varchar(15) par exemple.

    i.e:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cast(Agent_ID as Varchar(15))
    et ton problème est solutionné.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Suite et fin
    Merci de votre patience et je vous remercie pour vos différentes réponses.

    Cordialement,

    Nicolas

    [RESOLU]

Discussions similaires

  1. passer le nom de table en paramètre avec iReport
    Par imanoual dans le forum iReport
    Réponses: 12
    Dernier message: 27/03/2012, 20h49
  2. passer un nom de table en parametre
    Par fred19732 dans le forum Développement
    Réponses: 2
    Dernier message: 14/01/2011, 23h32
  3. Réponses: 9
    Dernier message: 11/01/2010, 10h30
  4. Passer un nom de table en paramètre.
    Par ygrim dans le forum Développement
    Réponses: 2
    Dernier message: 05/08/2008, 15h01
  5. [VB6] Possibilité de passer un nom de sub en parametre
    Par Vesta dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 31/05/2006, 10h17

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