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 :

utilisation d'une variable comme nom de colonne


Sujet :

Développement SQL Server

  1. #1
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut utilisation d'une variable comme nom de colonne
    bonjour,

    Je suis en train d'écrire une procédure pour remplacer les valeurs null dans une table, à partir de champs d'une autre table, ayant en commun l'identifiant (l'adresse mail ) comme les autres champs doivent rester différent si les valeurs ne correspondent pas, je fais une procédure qui colonne après colonne, va faire un update.

    j'ai donc (extrait )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DECLARE @colonne varchar(64)
    DECLARE curseurVariables CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'enews'
    OPEN curseurVariables 
    FETCH curseurVariables INTO @colonne
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    PRINT @colonne 
    UPDATE FROM table1 @colonne= table2.@colonne from table2 where...
    et là c'est le drame, j'ai pas fait de test mais ca me parait gros comme une maison que ca ne marchera pas.

    Est ce que cette ecriture pourrait passer ? Une idée pour remplacer ?

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Tu utilises quelle version SQL Server ?
    SQL 2000 ou SQL 2005/2008 ?
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    2005

  4. #4
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par argonath Voir le message
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE FROM table1 @colonne= table2.@colonne from table2 where...
    PAS BON.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE  MaBase.schema.maTable SET maTable.macolonne = valeurAmettre
    WHERE ....
    Etienne ZINZINDOHOUE
    Billets-Articles

  5. #5
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Evite d'utiliser les cursuers => problèmes de performances

    Tu as des idées ICI pour éviter l'utilisation des curseurs
    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  6. #6
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    je vais voir ça merci

    si j'ai bien compris l'écriture table2.@colonne ne marche pas c'est ça ?

    dans ce cas là comment faire en sorte que le update aille prendre la valeur correspondante dans la seconde table, à la ligne dont l'email est identique ?

  7. #7
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    ouep je suis coincé, je vois pas comment écrire la requête du coup, pour qu'il me remplace tout les null par la valeur de la même colonne dans l'autre table, prise à la ligne qui aura la même chose dans la colonne email

    malheureusement on ne peut pas faire n'importe quoi comme join etc dans les sous requetes

  8. #8
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Voici un exemple qui peut t'aider
    Soient deux tables T1 et T2
    qui ont la même structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE [dbo].[T1](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Nom] [varchar](100) NULL
    ) ON [PRIMARY]
    --Dans l'exemple je mets à jour la colonne T1.Nom avec les infos de la colonne T2.Nom
    --en me basant sur l'ID (colonne commune aux deux tables)

    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
    -- Creation/Remplissage de la table temporaire #Tmp
    USE [MaBase]
    CREATE TABLE #Tmp (ID INT, NOM VARCHAR(100))
    INSERT INTO #Tmp (ID,NOM)  
    SELECT T2.Id,T2.Nom 
    FROM T2 INNER JOIN T1 ON T1.Id = T2.Id 
    ORDER BY T2.Id
     
    DECLARE @TraitementColonneID VARCHAR(50) 
    ,@TraitementColonneNOM VARCHAR(50)
    ,@SQL VARCHAR (max), @DEL VARCHAR (max)  
    WHILE EXISTS ( SELECT TOP 1 ID FROM #Tmp )
    BEGIN
    SET @TraitementColonneID = (SELECT TOP 1 ID FROM #Tmp)
    SET @TraitementColonneNOM = (SELECT TOP 1 NOM FROM #Tmp)
     
    SET @SQL = 'UPDATE T1 SET T1.Nom = '''+ @TraitementColonneNOM + ''' WHERE Id = '+ @TraitementColonneID + ';'  
    --PRINT (@SQL)
     EXEC (@SQL)  
    -- Supprimer la ligne traitée dans la table temporaire
    SET @DEL = 'DELETE FROM #Tmp WHERE ID = '''+ @TraitementColonneID + ''';'  
    --PRINT (@DEL)
    EXEC (@DEL) 
    END
     
    --Suppression de la table temporaire
    DROP TABLE #Tmp
    Du courage
    Etienne ZINZINDOHOUE
    Billets-Articles

  9. #9
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    je me plonge dans ton code tout de suite ^^

  10. #10
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Pour tester rapidement tu peux peupler les tables avec ces requêtes

    --> Pour la table T1
    ===========
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    --Peupler T1 avec 
    DECLARE @i INT 
    SET @i = 0
    WHILE (@i < 100)
    BEGIN
    INSERT INTO T1 VALUES(0)
    SET @i = @i +1 ;
    END
    --> Pour la table T2
    ===========
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    --Peupler T2 avec 
    DECLARE @i INT 
    SET @i = 0
    WHILE (@i < 100)
    BEGIN
    INSERT INTO T2 VALUES(@i)
    SET @i = @i +1 ;
    END

    --> Affichage
    ==============
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM T1
    SELECT * FROM T2
    Table T1

    Id Nom
    1 0
    2 0
    3 0
    4 0
    ... ...
    99 0
    100 0

    Table T2

    Id Nom
    1 0
    2 1
    3 2
    4 3
    ... ...
    99 98
    100 99
    Etienne ZINZINDOHOUE
    Billets-Articles

  11. #11
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Tiens nous au courant de la suite
    Etienne ZINZINDOHOUE
    Billets-Articles

  12. #12
    Membre averti Avatar de argonath
    Homme Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Juillet 2009
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 248
    Points : 381
    Points
    381
    Par défaut
    bon voilà ma solution ( j'ai laissé un curseur sur les noms de colonnes pour pas faire des requêtes à rallonge et parcequ'il y en a peu )

    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
     
    CREATE PROCEDURE [dbo].[achievement] AS 
    DECLARE @colonne varchar(64), @create varchar(max), @dataType varchar(32), @length varchar(32), @insert varchar(max), @table varchar(32)
    SET @table = 'OptinsCommerciaux' 
     
    DECLARE curseurVariables CURSOR FOR 
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @table
    OPEN curseurVariables 
    FETCH curseurVariables INTO @colonne 
     
     
    WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT @colonne
    IF @colonne = 'email' BEGIN FETCH curseurVariables INTO @colonne PRINT @colonne END
    SET @create = 'CREATE TABLE TMP (EMAIL varchar(64), colonneCourante '
    SET @dataType = (SELECT data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'test' AND column_name = @colonne) 
    SET @length = (SELECT character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'test' AND column_name = @colonne) 
     
    IF (@dataType = 'varchar') 
    BEGIN SET @create = @create + @dataType + '(' + @length + '))' END 
    ELSE BEGIN SET @create = @create + @dataType + ')' END 
    PRINT ( @create ) 
    EXEC ( @create ) 
    SET @insert = 'INSERT INTO Tmp (email,colonneCourante) select ' + @table + '.email, ' + @table + '.[' + @colonne + '] from ' + @table + ' INNER JOIN test on test.email = ' + @table + '.email ' + 'where test.[' + @colonne + '] is null' 
    PRINT ( @insert ) 
    EXEC ( @insert ) 
    DECLARE @TraitementMail VARCHAR(50), @TraitementColonne VARCHAR(50), @SQL VARCHAR(max), @DEL VARCHAR(max) 
     
    WHILE EXISTS (SELECT TOP 1 Email FROM Tmp) 
    BEGIN 
    SET @TraitementMail = (SELECT TOP 1 Email FROM Tmp) 
    SET @TraitementColonne = (SELECT TOP 1 colonneCourante FROM Tmp)
    SET @SQL = 'UPDATE test SET test.[' + @colonne + '] = ''' + @TraitementColonne + ''' WHERE Email = ''' + @TraitementMail + ''';' 
    PRINT (@SQL)
    EXEC (@SQL) 
    SET @DEL = 'DELETE FROM Tmp WHERE Email = ''' + @TraitementMail + ''';' 
    PRINT (@DEL) 
    EXEC (@DEL) 
    END 
    DROP TABLE Tmp
    FETCH curseurVariables INTO @colonne
    END

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/06/2014, 17h43
  2. utiliser une variable comme nom d'objet! est-ce possible?
    Par Rusty2096 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 07/06/2009, 15h33
  3. [ProC][SQL] Utiliser une variable comme nom de curseur
    Par adiGuba dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 06/12/2006, 11h55
  4. Utiliser une variable comme nom de fichier
    Par lo00_ dans le forum MATLAB
    Réponses: 1
    Dernier message: 28/06/2006, 13h57
  5. [curseurs] utiliser une variable comme nom de champ
    Par Christian31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2005, 14h12

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