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 :

update Table1 from select table2


Sujet :

MS SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut update Table1 from select table2
    Bonjour

    Je dispose de deux table : T1 et T1History
    Je dois sur base d'un select eliminer des records de T1 pour les inserer dans T1History

    Est-il possible de faire cela en SQL avec une simple requete ?
    Actuellement je le fais en Csharp avec des boucles de Insert et Delete

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Un déclencheur sur T1 qui insère les données dans T1Histo sur ordre de suppression semble parfaitement indiqué ici !

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Votre table T1History entre-t-elle en jeu dans des contraintes d'intégrité ?

    Si ce n'est pas le cas, vous pouvez utiliser directement la clause OUTPUT :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DELETE FROM T1
    OUTPUT DELETED.* 
        INTO T1History
    WHERE ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    insert into T1History (col1, col2, ...)
    select col1, col2, ....
    from T1 
    where (mes conditions) 
     
    delete T1 
    where (mes conditions)
    Où est le problème ?

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci de vos réponses

    Le problème c'est que je voudrais ne pas être obligé de nommer toutes les colonnes dans la commande

    Pour aieeeeeu : la seule contrainte c'est que T1 contient une Primary Key identity AutoIncrément et que donc T1History aussi

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par olibara Voir le message
    Le probleme c'est que je voudrais ne pas etre obligé de nommer toutes les colonnes dans la commande
    Faut pas charrier !
    Avec SSMS, ça se fait en 3 secondes.
    Ou alors avec la table information_schema.columns...

    Citation Envoyé par olibara Voir le message
    Pour aieeeeeu : la seule contrainte c'est que T1 contient une Primary Key identity AutoIncrément et que donc T1History aussi
    Où est le problème ? Si il faut que ce soit la même valeur, il suffit de retirer l'identity dans T1History, parce que ça n'a pas de bon sens alors.

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Faut pas charrier !
    Avec SSMS, ça se fait en 3 secondes.
    Ou alors avec la table information_schema.columns
    Attends ! je suis pas dans SSMS mais dans un programme Csharp
    Je sais que tu va dire que je n'ai qu'a ecrire une procedure stockée ....
    Mais la question n'est pas là
    Je voulais savoir s'il etait possible de s'affranchir de l'enumération des colonnes.
    Au passage ce qui manque a SQL c'est une notion d'exlusion genre
    *!pkID (tout sauf pkID)

    C'est vrai la suggestion de aieeeuuuuu est la plus rationelle !

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je voulais savoir s'il etait possible de s'affranchir de l'enumération des colonnes.
    Et indirectement d'une procédure stockée

    Mais que vous ont'elle fait?

  9. #9
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Le probleme c'est que je voudrais ne pas etre obligé de nommer toutes les colonnes dans la commande

    Et le jour ou un de vos chers développeur ajoutera une colonne dans la table T1 dont vous vous fich.. dans la table d'historique vous regretterez de ne pas avoir eu le hum disons "courage" de citer les colonnes.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par olibara Voir le message
    Attends ! je suis pas dans SSMS mais dans un programme Csharp
    Et le copier/coller n'est pas possible ?

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Citation Envoyé par iberserk
    Et le jour ou un de vos chers développeur ajoutera une colonne dans la table T1 dont vous vous fich.. dans la table d'historique vous regretterez de ne pas avoir eu le hum disons "courage" de citer les colonnes.
    Finalement c'est une question de point de vue
    Moi je pensais a la modification des tables et à (l'oubli) de la repercusion dans le code : que ce soit une procédure stockée ou non d'ailleurs

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Finalement c'est une question de point de vue
    Ok,

    Dans tout les cas ce n'est pas à votre SGBD de déduire les colonnes concernées par votre INSERT, il n'y a pas de notion d'ordre pour lui...

  13. #13
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Si votre table historique a exactement la même structure que la table source, vous pouvez aussi ne pas mettre la colonne ID de la table historique en identity, et du coup importer directement avec la requête que je vous ai donnée. Mais personnellement, je trouve aussi qu'il serait plus propre de noter explicitement les colonnes...

    Vous pouvez aussi opter pour la solution de Waldar, et créer un trigger DDL, qui va [re]créer le trigger DML "FOR DELETE" sur T1 à chaque modification de celle-ci, en allant chercher les colonnes dans les vues système (et éventuellement modifier la table T1Histo dans la foulée pour répercuter les modifications sur T1...)

  14. #14
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Vous pouvez passer par une vue également pour contrôler les colonnes qui seront concernés par votre INSERT. Il n'y aura pas besoin d'énumérer vos colonnes par la suite.

    ++

  15. #15
    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 : 43
    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
    ou encore utiliser :

    - SET IDENTITY INSERT maTable OFF
    - INSERT maTableHistorique SELECT * FROM maTable
    - SET IDENTITY INSERT maTable ON

    @++

  16. #16
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci a tous pour toutes ces suggestions et informations instructives

    Finalement comme je dois quand meme enumerer les colonnes, et que cette table est etroitement liée a l'application qui l'utilise, j'exploite la classe que j'ai ecrit en Csharp pour le faire.

    C'est donc la classe qui gere le remove et l'insert
    J'ai cependant suprimé l'identity dans la table History afin de conserver le pkId original.

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

Discussions similaires

  1. [Débutant] delete from table1 left join table2
    Par djelloharmel dans le forum VB.NET
    Réponses: 5
    Dernier message: 30/11/2011, 10h17
  2. UPDATE TABLE1, TABLE2
    Par Daftman dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2011, 10h59
  3. Update From Select
    Par giova_fr dans le forum SQL
    Réponses: 7
    Dernier message: 02/07/2010, 15h04
  4. update table1 from table2
    Par lesageelu dans le forum SQL
    Réponses: 9
    Dernier message: 09/07/2009, 14h00

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