|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Inscription : octobre 2007 Messages : 3 945 ![]() |
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) |
|
|
00
|
|
|
#2 |
![]() ![]() |
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 |
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
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 :
|
||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 520 ![]() |
Code :
__________________
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. |
||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : octobre 2007 Messages : 3 945 ![]() |
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) |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 520 ![]() |
Citation:
![]() Avec SSMS, ça se fait en 3 secondes. Ou alors avec la table information_schema.columns... 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. |
|
|
|
00
|
|
|
#7 | |
|
Membre Expert
![]() Inscription : octobre 2007 Messages : 3 945 ![]() |
Citation:
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) |
|
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() |
Citation:
![]() Mais que vous ont'elle fait?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#9 | |
|
Membre Expert
![]() |
Citation:
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. |
|
|
|
10
|
|
|
#10 |
|
Expert Confirmé
![]() dba Inscription : juillet 2007 Messages : 2 520 ![]() |
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. |
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : octobre 2007 Messages : 3 945 ![]() |
Citation:
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) |
|
|
|
00
|
|
|
#12 | |
|
Membre Expert
![]() |
Citation:
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. |
|
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
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...) |
|
|
00
|
|
|
#14 |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
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.
++ |
|
00
|
|
|
#15 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
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 |
|
00
|
|
|
#16 |
|
Membre Expert
![]() Inscription : octobre 2007 Messages : 3 945 ![]() |
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) |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com