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 :

Concaténer pour former le nom de la table


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Femme Profil pro
    Webmaster
    Inscrit en
    Décembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2017
    Messages : 34
    Par défaut Concaténer pour former le nom de la table
    Bonjour,

    comment faire la concaténation de deux variables pour former le nom d'une table sous transact sql?

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Avec + ou CONCAT

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre averti
    Femme Profil pro
    Webmaster
    Inscrit en
    Décembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2017
    Messages : 34
    Par défaut
    Pouvez vous me dire qu'est ce qui ne marche pas dans ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select * from (select concat('TPaie',2017) )

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Pour ce genre de besoin, vous ne pouvez pas utiliser CONCAT, il faut utiliser du SQL DYNAMIQUE


    Cf. http://sheikyerbouti.developpez.com/execute_immediate/

  5. #5
    Membre averti
    Femme Profil pro
    Webmaster
    Inscrit en
    Décembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2017
    Messages : 34
    Par défaut
    Voila le code que j'utilise ,j'aimerai savoir comment je peux affecter le résultat qui s'affiche par print dans une variable pour l'utiliser comme nom d'une table .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare @vartp nvarchar(6)
    declare @varann nvarchar(4)
    declare @res nvarchar(10)
    set @vartp='TPaie'
    set @varann='2017'
    set @res=@vartp+@varann
    print(@res)

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    Pour cela il te faudra, comme cela a été évoqué ci-dessus par escartefigue, utiliser le "SQL Dynamique"
    Le lien indiqué ci-dessous traite du sujet mais les exemples utilisent principalement la syntaxe ORACLE.
    Ici, nous somme sur le forum SQL Server. Pour SQL Server, il te faudra utiliser la procédure système sp_executesql.
    Tu devras écrire quelque chose comme ceci :

    Code 'SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    declare @vartp nvarchar(6)
    declare @varann nvarchar(4)
    declare @res nvarchar(10)
    declare @sqlStmt nvarchar(max);            --  nouvelle ligbe (nouvelle variable à déclarer) 
    set @vartp='TPaie'
    set @varann='2017'
    set @res=@vartp+@varann
    print(@res)
    set @sqlStmt = N'SELECT * FROM dbo.'+@res; -- nouvelle ligne 
    EXECUTE sp_executesql @SqlStmt;            -- nouvelle ligne

    A+

  7. #7
    Membre averti
    Femme Profil pro
    Webmaster
    Inscrit en
    Décembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2017
    Messages : 34
    Par défaut
    Bonjour,

    J'utilise des curseurs à l'intérieur d'une fonction et je veux mettre à la place des noms des tables TPaie2017 et Etatemp2017 deux variables, un qui prend 'TPaie' et l'autre prend '2017'.
    Comment faire la concaténation entre les deux variables dans l'exemple ci-dessous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    declare curt2 cursor  for Select  TPaie2017.MEmploye,EtatEmp2017.CFonctio From TPaie2017 inner Join EtatEmp2017 On EtatEmp2017.MEmploye=TPaie2017.MEmploye

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Les fonctions scalaires sont par nature déterministes, aussi, l'utilisation du SQL Dynamique est strictement interdite dans les fonctions scalaires, du moins classiques.
    Sinon, dans une procédure stockée, tu pourrais écrire quelque chose comme ceci :
    Code SQL : 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
    declare @curt2OUT cursor; 
     
    declare 
         @SqlStmt   nvarchar(max)
        ,@MEmploye   ??? -- précises le type (?) 
        ,@CFonctio   ??? -- précise le type (?) 
     
    declare @vartp nvarchar(6)
    declare @varann nvarchar(4)
    declare @tpTableName nvarchar(128)  -- Nom de la table  "Type Paie" 
    declare @eeTableName nvarchar(128) --  Nom de la table  "Etat Employé" 
     
    set @vartp='TPaie'
    set @varann='2017'
    set @tpTableName=@vartp+@varann  -- Exemple 'TPaie2017' 
    set @eeTableName= N'Etatemp'+ @varann;  -- Exemple 'EtatEmp2017'
     
    set @SqlStmt = N'set @Curt2IN = cursor local forward_only read_only for' +  
    N' Select ' + @tpTableName+'.MEmploye' + N', '+ @eeTableName + N'.' + N'.CFonctio' + 
    N' From dbo.' + @tpTableName + 
    N' inner Join dbo.' + @eeTableName + 
    N' On ' + @eeTableName +N'.MEmploye' + N'=' + @tpTableName + N'.MEmploye' + 
    N' open @Curt2IN;'
     
    PRINT  @SqlStmt  
     
    exec sys.sp_executesql   @SqlStmt 
        ,N'@Curt2IN cursor output'
        ,@curt2OUT output 
     
    fetch next from @curt2OUT into @MEmploye, @CFonctio
    while (@@fetch_status = 0)
    begin
        /* 
          ..... Insère  ton traitement ici ... .. 
        
        */ 
     
        fetch next from @curt2OUT into @MEmploye, @CFonctio
    end
     
    close @curt2OUT
    deallocate @curt2OUT
    A+

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Les fonctions scalaires ne sont pas forcément déterministes, d'ailleurs ont peut renvoyer un simple RAND() ou un GETDATE()En revanche, toute modification de l'état de la base de données (données elle même ou options) y est interdite.

    Donc pas de DELETE, INSERT ou autre UPDATE, pas d'instruction SET modifiant les paramètres, mais pas non plus d'appel a des procédures stockées ou de SQL Dynamique, qui pourraient exécuter de telles instructions

  10. #10
    Membre averti
    Femme Profil pro
    Webmaster
    Inscrit en
    Décembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2017
    Messages : 34
    Par défaut
    Merci ça fonctionne bien

  11. #11
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Les fonctions scalaires ne sont pas forcément déterministes, d'ailleurs ont peut renvoyer un simple RAND() ou un GETDATE()En revanche, toute modification de l'état de la base de données (données elle même ou options) y est interdite.

    Donc pas de DELETE, INSERT ou autre UPDATE, pas d'instruction SET modifiant les paramètres, mais pas non plus d'appel a des procédures stockées ou de SQL Dynamique, qui pourraient exécuter de telles instructions
    Merci aieeeuuuuu, pour tes précisions complémentaires, toujours aussi instructives. Je suis d'accord avec toi, sauf pour la fonction RAND().
    GETDATE() est bien autorisée dans une fonction, même si elle rend effectivement la fonction non déterministe. En revanche, et sauf erreur de ma part, ce n'est pas vraie pour la fonction RAND(). Je viens de faire quelques tests sous SQL Server 2008 R2 et SQL Server 2014 et cela ne fonctionne pas. On obtient le message ci-après:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 443, Level 16, State 1, ... 
    Utilisation non valide d'un opérateur présentant des effets secondaires 'rand' dans une fonction.

    Sinon pour le reste tu as raison une fonction scalaire peut être non déterministe. Pour le vérifier :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT OBJECTPROPERTYEX(OBJECT_ID('dbo.MafonctionScalaire'), N'IsDeterministic');
    qui renvoie respectivement 1 ou 0 selon que la fonction est déterministe ou non.

    A+

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    en effet, le RAND ne passe pas directement dans une fonctions, merci pour la correction.

    chose amusante à ce sujet, on peut contourner comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE VIEW dbo.RANDOM
    AS
        SELECT RAND() AS Random
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE FUNCTION dbo.R()
    RETURNS FLOAT
    AS
    BEGIN
        DECLARE @ret AS FLOAT;
     
        SELECT @ret = Random FROM dbo.RANDOM;
     
        RETURN @ret;
    END
    chose encore plus amusante, on obtient des comportements différents, avec des valeurs identiques lors de l'utilisation directe de la fonction RAND(), mais des valeurs différentes si l'on passe par la fonction dbo.R :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT RAND() FROM sys.objects
    0,289417900117308
    0,289417900117308
    0,289417900117308
    0,289417900117308
    0,289417900117308
    0,289417900117308
    0,289417900117308
    ...
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.R() FROM sys.objects
    0,766857731568752
    0,812636701653635
    0,795330303512908
    0,0529166055365246
    0,0657088290183416
    0,633315273593024
    0,468770243897288
    ...
    

Discussions similaires

  1. [AC-2003] concatenat pour composer le nom d'une table
    Par abdelillah00 dans le forum Access
    Réponses: 4
    Dernier message: 12/03/2017, 15h00
  2. Utilisation d'un tContextLoad pour paramétrer le nom de ma table cible ?
    Par Mailgifson dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 02/07/2015, 01h44
  3. Concaténation pour former variable
    Par masseur dans le forum Langage
    Réponses: 2
    Dernier message: 21/07/2008, 16h26
  4. Concaténer une chaine et un nombre pour former un nom de variable ?
    Par debie1108 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/04/2007, 07h38
  5. Concaténation de deux integer pour former une clé primaire
    Par stoukou dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 08/09/2005, 10h34

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