2008-11-11 9 views
2

Je tente d'insérer une copie d'une ligne d'une table dans une autre table avec le même schéma, avec l'ajout d'une colonne (un horodatage) pour fournir un "historique" de la première table dans MS Sql Server 2005.SELECT INTO avec une colonne supplémentaire

donc, ma requête, sans la colonne supplémentaire serait:

"SELECT INTO [WebsiteHistory] FROM [Website]" 

Je veux remplir la colonne d'horodatage aussi bien, mais ne suis pas sûr de savoir comment mieux faire. Je voudrais faire quelque chose comme:

"SELECT Website.*, '" + DateTime.Now.ToShortDateString() + "' INTO [WebsiteHistory] FROM [Website]" 

Mais cela ne devrait pas travailler, surtout si la colonne d'horodatage n'est pas la dernière. Est-ce qu'il y a un moyen de faire ça?

+0

Ne jamais être implicite. Ajouter une colonne à une table ne devrait pas casser le code, mais cela casserait votre code. –

+0

Il est préférable de laisser ces choses se produire sur le serveur SQL, par exemple via un déclencheur ON UPDATE. De cette façon, vous n'avez pas à vous soucier de votre application. – Tomalak

Répondre

14

Soyez averti. Cela fonctionne, mais il est ni agréable ni recommandé:

INSERT 
    WebsiteHistory 
SELECT 
    *, 
    GETDATE() 
FROM 
    Website 
WHERE 
    Id = @WebsiteId 

Cela suppose WebsiteHistory a la même structure que Website (vous avez dit qu'il a), plus il y a un champ DATETIME supplémentaire.

Mieux vaut cela, car il est beaucoup plus fail-safe (au détriment d'être plus bavard):

INSERT 
    WebsiteHistory 
    (
    Id, 
    Field1, 
    Field2, 
    Field3, 
    Field4, 
    ModifiedDate 
) 
SELECT 
    Id, 
    Field1, 
    Field2, 
    Field3, 
    Field4, 
    GETDATE() 
FROM 
    Website 
WHERE 
    Id = @WebsiteId 
+0

Depuis quand est verbeux mauvais? –

+0

Hm ... Ai-je dit que c'était? – Tomalak

+0

Ne vaudrait-il pas mieux créer une colonne timestamp avec une contrainte par défaut pour la remplir automatiquement lorsqu'une ligne est ajoutée à la table? –

2

Vous ne pouvez pas définir une contrainte par défaut sur la colonne qui remplirait automatiquement la colonne d'horodatage lorsqu'une ligne est insérée dans la table?

Questions connexes