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 :

opérations sur 1 table à partir de données (dont noms colonnes) dans une 1 table


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 343
    Points : 129
    Points
    129
    Par défaut opérations sur 1 table à partir de données (dont noms colonnes) dans une 1 table
    Bonjour,

    Je dispose de 2 tables:

    La première est la suivante: TABLE_A_TRAITER
    avec les colonnes suivantes (noms colonnes et exemple remplissage):
    ID INFO1 INFO2
    0 toto tutu
    1 titi tati
    2 tata titi

    La seconde est la suivante: TABLE_POUR_SUPPRESSION
    NOM_COL DONNEE
    INFO1 tata
    INFO2 tutu

    J'aimerai aller chercher chaque nom de colonne dans la seconde table, avec la donnée correspondante pour en faire la suppression de lignes dans la première table.

    Concrétement, j'aimerai connaître la requète où j'obtiendrai la table suivante:
    ID INFO1 INFO2
    1 titi tati

    J'ai pensé utilisé la requète suivante de la faq:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT   COLUMN_NAME, ORDINAL_POSITION
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME='MA_TABLE'
    Merci d'avance pour votre aide!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    tu peux faire 'à l'ancienne'

    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
    declare @nb int
    declare @nom_champ1 varchar(50)
    declare @val_champ1 varchar(50)
    declare @str varchar(500)
     
    SELECT @nb=count(*) FROM TABLE_POUR_SUPPRESSION
    WHILE @nb>0 
    BEGIN 
    SET ROWCOUNT=1 
    SELECT @nom_champ1=NOM_COL, @val_champ1=DONNEE FROM TABLE_POUR_SUPPRESSION 
    SET ROWCOUNT=0 
     
    BEGIN TRAN 
    SET @str='DELETE from TABLE_A_TRAITER WHERE '+ @nom_champ1 +'='''+ @val_champ1+''
    exec(@str)
    SET @str='DELETE from TABLE_POUR_SUPPRESSION WHERE NOM_COL='''+ @nom_champ1 +''' AND DONNEE='''+ @val_champ1+''
    exec(@str)
    COMMIT
    SELECT @nb=count(*) FROM TABLE_POUR_SUPPRESSION
    END
    ou tu passes par un curseur
    Errare humanum est, perseverare diabolicum (Sénèque)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 343
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par serge0934 Voir le message
    tu peux faire 'à l'ancienne'

    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
    declare @nb int
    declare @nom_champ1 varchar(50)
    declare @val_champ1 varchar(50)
    declare @str varchar(500)
     
    SELECT @nb=count(*) FROM TABLE_POUR_SUPPRESSION
    WHILE @nb>0 
    BEGIN 
    SET ROWCOUNT=1 
    SELECT @nom_champ1=NOM_COL, @val_champ1=DONNEE FROM TABLE_POUR_SUPPRESSION 
    SET ROWCOUNT=0 
     
    BEGIN TRAN 
    SET @str='DELETE from TABLE_A_TRAITER WHERE '+ @nom_champ1 +'='''+ @val_champ1+''
    exec(@str)
    SET @str='DELETE from TABLE_POUR_SUPPRESSION WHERE NOM_COL='''+ @nom_champ1 +''' AND DONNEE='''+ @val_champ1+''
    exec(@str)
    COMMIT
    SELECT @nb=count(*) FROM TABLE_POUR_SUPPRESSION
    END
    ou tu passes par un curseur
    euh je te remercie de m'avoir répondu, je vais regarder attentivement, mais pas tout de suite car là je crée ma base justement... (c'est juste que j'étais en attente de validation donc j'anticipais, pas facile sans la base pour voir ce que donne les requètes!)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 343
    Points : 129
    Points
    129
    Par défaut
    Merci pour ta réponse que je n'ai utilisée que maintenant...

    en tout cas ça marche très bien, mis à part 4 ' qui manquaient (en gras et souligné)
    de plus, j'ai mis les "SET ROWCOUNT=1 " et "SET ROWCOUNT=0" en commentaire car d'une part ça bloquait la proc (sans doute parce que non déclaré) et d'autre part je ne sais pas à quoi ça sert...

    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
    declare @nb int
    declare @nom_champ1 varchar(50)
    declare @val_champ1 varchar(50)
    declare @str varchar(500)
     
    SELECT @nb=count(*) FROM TABLE_POUR_SUPPRESSION
    WHILE @nb>0 
    BEGIN 
    --SET ROWCOUNT=1 
    SELECT @nom_champ1=NOM_COL, @val_champ1=DONNEE FROM TABLE_POUR_SUPPRESSION 
    --SET ROWCOUNT=0 
      
    BEGIN TRAN 
    SET @str='DELETE from TABLE_A_TRAITER WHERE '+ @nom_champ1 +'='''+ @val_champ1+''''
    exec(@str)
    SET @str='DELETE from TABLE_POUR_SUPPRESSION WHERE NOM_COL='''+ @nom_champ1 +''' AND DONNEE='''+ @val_champ1+''''
    exec(@str)
    COMMIT
    SELECT @nb=count(*) FROM TABLE_POUR_SUPPRESSION
    END
    Un grand merci en tout cas!

  5. #5
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    pour ton info

    SET ROWCOUNT 1
    SELECT @nom_champ1=NOM_COL, @val_champ1=DONNEE FROM TABLE_POUR_SUPPRESSION
    SET ROWCOUNT 0
    j'avais mis un '=' en trop

    'set rowcount 1' signifie que la requête suivante exécutée ne retournera qu'UNE seule ligne

    'set rowcount x' (x étant un entier) signifie que la requête suivante ne retournera que x lignes sauf si x=0 alors TOUTES les lignes sont renvoyées

    dans ton cas cela fonctionne mais pour plus de viabilité remets les set rowcount

    PS: n'oublies pas de remettre a la fin SET ROWCOUNT 0 car autrement la prochaine requête lancée ne retournera que la dernière valeur du rowcount
    Errare humanum est, perseverare diabolicum (Sénèque)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/11/2013, 15h39
  2. Réponses: 1
    Dernier message: 24/02/2011, 19h11
  3. Requete SQL sur une table dont le nom est dans une autre table
    Par orangepresse dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/09/2007, 13h32
  4. Réponses: 13
    Dernier message: 20/04/2007, 17h30
  5. Réponses: 8
    Dernier message: 19/04/2007, 19h41

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