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 :

requête dynamique concernant la table


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 175
    Points : 57
    Points
    57
    Par défaut requête dynamique concernant la table
    Bjr tout le monde!
    Est-ce-qu'il est possible de faire une requête en considérant que le nom de la table soit une variable?
    car les noms de mes tables sont comme suit :
    table2006
    table2007
    table2008
    et je veux lancer une requête
    SELECT * FROM (la variable ici contient le nom de la table de l'année en cours)
    Merci!

  2. #2
    Membre actif
    Inscrit en
    Février 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 185
    Points : 224
    Points
    224
    Par défaut
    Oui c'est parfaitement possible
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE @sql VARCHAR(800)
    DECLARE @matable VARCHAR(20)
     
    set @matable='table' + CAST(year(getdate())AS CHAR(4))
    set @sql='SELECT * FROM ' + @matable
    exec(@sql)

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 175
    Points : 57
    Points
    57
    Par défaut
    C cool
    Merci !

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Bonjour, je me permet de creuser le problème, car j'y suis également confronté.

    Dans un trigger sur un INSERT je récupère une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select @Variable = select inserted.article from inserted
    Puis je fais une boucle pour insérer dans plusieurs bases l'article récupéré. Le nom de chaque base est récupéré dynamiquement et est donc une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select NomBase from SOCIETES.dbo.Societes WHERE statut = 1
    OPEN SOCIETES_Cursor
    FETCH NEXT FROM SOCIETES_Cursor into @societe
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
     
    SET @requete = 'INSERT INTO+'@Societe+'.dbo.articles (Reference,) (Select * from ARTICLES WHERE Articles.reference = @Variable)'
     
    EXEC(@requete)
    Ce code me renvoie une erreur car @Variable n'est pas déclarée. J'ai vu dans un forum qu'en effet le "EXEC" fait le boulot dans un autre environnement dans lequel la variable @Variable est inconnue... Je ne sais plus quoi faire...

    D'avance merci de vos propositions de solutions

  5. #5
    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,

    Votre code devrait donc être

    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
    SELECT @Variable = article
    FROM inserted
     
    DECLARE SOCIETES_Cursor CURSOR FOR
    	SELECT NomBase
    	FROM SOCIETES.dbo.Societes
    	WHERE statut = 1
    FOR READ ONLY
     
    DECLARE @requete VARCHAR(512),
    		@societe VARCHAR(50)
     
    OPEN SOCIETES_Cursor
    FETCH NEXT FROM SOCIETES_Cursor INTO @societe
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	SET @requete = 'INSERT INTO ' + @Societe + '.dbo.articles (Reference) SELECT Reference FROM dbo.ARTICLES WHERE Articles.reference = ' + CAST(@Variable AS VARCHAR)
    	PRINT @requete
    	EXEC(@requete)
    	FETCH NEXT FROM SOCIETES_Cursor INTO @societe
    END
    Pour débugger du code SQL dynamique, rien ne vaut un PRINT de la commande qui va être exécutée

    En effet lorsque vous exécutez une commande EXEC, vous créez un nouveau contexte d'exécution, inaccessible au contexte courant.

    Votre requête est effectuée à priori dans un trigger, et sa spécification montre une erreur dans la conception de votre SI ...

    @++

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

Discussions similaires

  1. [2012] Fonction table à partir d'une requête dynamique
    Par VITALTH dans le forum Développement
    Réponses: 5
    Dernier message: 13/05/2015, 14h06
  2. Réponses: 7
    Dernier message: 10/03/2014, 14h19
  3. [AC-2003] Requête concernant 2 Tables non liées
    Par gentoo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/03/2011, 18h53
  4. requête dynamique concernant la table
    Par ravaid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/02/2008, 09h43
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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