Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/05/2011, 16h50   #1
Membre Expert
 
Inscription : octobre 2007
Messages : 3 945
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 945
Points : 1 905
Points : 1 905
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.
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h58   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Un déclencheur sur T1 qui insère les données dans T1Histo sur ordre de suppression semble parfaitement indiqué ici !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h59   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
3
4
5
 
DELETE FROM T1
OUTPUT DELETED.* 
    INTO T1History
WHERE ...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h00   #4
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
Code :
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 ?
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h15   #5
Membre Expert
 
Inscription : octobre 2007
Messages : 3 945
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 945
Points : 1 905
Points : 1 905
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 18h22   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
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.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h37   #7
Membre Expert
 
Inscription : octobre 2007
Messages : 3 945
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 945
Points : 1 905
Points : 1 905
Citation:
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 !
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h42   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 19h44   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 19h45   #10
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
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 ?
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 21h00   #11
Membre Expert
 
Inscription : octobre 2007
Messages : 3 945
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 945
Points : 1 905
Points : 1 905
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 08h32   #12
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h03   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h17   #14
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
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.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h20   #15
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 668
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 668
Points : 8 718
Points : 8 718
ou encore utiliser :

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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 12h35   #16
Membre Expert
 
Inscription : octobre 2007
Messages : 3 945
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 945
Points : 1 905
Points : 1 905
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.
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h03.


 
 
 
 
Partenaires

Hébergement Web