2009-06-09 9 views
5

J'écris un certain nombre de scripts pour mettre à jour de nombreuses tables d'accès. Je voudrais ajouter une colonne à chacun qui a un champ appelé "date_created" qui est un timestamp de quand l'enregistrement est créé. Faire cela à travers la vue de la table est simple, il suffit de définir DefaultValue = now(). Cependant, comment pourrais-je accomplir cela en SQL?Microsoft Access DateTime par défaut maintenant via SQL

Ceci est ma tentative actuelle pour les tables qui ont déjà la colonne. Cet exemple utilise "tblLogs".

ALTER TABLE tblLogs ALTER COLUMN date_created DEFAULT now() 

Merci pour votre aide!

Mise à jour - Y aurait-il un moyen de le faire dans VBA?

Mise à jour 2 - Testée toutes les réponses et les suivantes par onedaywhen est la plus courte et la plus précise

CurrentProject.Connection.Execute _ 
    "ALTER TABLE tblLogs ALTER date_created DATETIME DEFAULT NOW() NOT NULL;" 
+1

Now() est une fonction stupide d'utiliser si vous voulez RENDEZ-VOUS AMOUREUX. Ce que vous voulez vraiment, c'est définir la valeur par défaut à Date(). –

+0

Ils indiquent "horodatage DateTime ... date de création de l'enregistrement", pour lequel la fonction NOW() est la plus appropriée. – onedaywhen

+0

OK, il serait plus précis de coordonner le nom du champ et les données saisies, mais l'appeler "stupide" est impoli. La rétroaction constructive ne doit pas être condescendante ni contenir d'insultes. – JeffO

Répondre

6

Je suppose:

  • votre base de données cible est le moteur de l'ECA ou Jet, plutôt que SQL Server;
  • vous voulez la date et temps à savoir ce qu'on appelle CURRENT_TIMESTAMP dans la norme SQL (non directement pris en charge par ACE/Jet, cependant) et à ne pas confondre avec TIMESTAMP type de données SQL Server;
  • vous voulez une réponse en utilisant SQL DDL.

Si vous avez créé votre table à l'aide de cette DDL SQL:

CREATE TABLE tblLogs 
(
    date_created DATETIME NOT NULL 
); 

alors la LDD SQL suivante ajouterait le DEFAULT votre besoin:

ALTER TABLE tblLogs ALTER 
    date_created DATETIME DEFAULT NOW() NOT NULL; 

ci-dessus syntaxe ACE/Jet SQL est Mode de requête ANSI-92 Pour l'utiliser via l'interface MS Access (par exemple, vue SQL d'un objet Query), voir Microsoft Office Access: About ANSI SQL query mode (MDB). Pour ce faire par programme en utilisant SQL DDL nécessite (AFAIK) l'utilisation de OLE DB, qui dans VBA nécessite (AFAIK) l'utilisation d'ADO. DAO utilise toujours la syntaxe ANSI-89 Query Mode, dont la syntaxe SQL DDL ne prend pas en charge DEFAULT.

Si vous utilisez Access (plutôt que ACE/autonome Jet), vous pouvez utiliser une seule ligne de code VBA (ADO):

CurrentProject.Connection.Execute "ALTER TABLE tblLogs ALTER date_created DATETIME DEFAULT NOW() NOT NULL;" 
2

lieu maintenant() vous pouvez utiliser getdate(). Impossible de vérifier une autre partie de la syntaxe (pas de sql ici et je change rarement de tables :)), mais ça devrait être à peu près la même chose.

éditer: Il semble que SQL n'autorise pas les modifications par défaut si facilement. Regardez this page, où un exemple pratique est fourni - vous devez changer les contraintes, car MSSQL traite les valeurs par défaut comme des contraintes. Désolé pour la désinformation.

+0

I GetDate() va ramener aujourd'hui et pas exactement la seconde et sera presque la même chose que Now() pour autant que je sache –

+0

getdate() retourne plein – Arvo

+0

Apparemment, MSSQL est un peu plus dur avec des valeurs par défaut - vous devez supprimer/créer des contraintes spécifiques J'ai édité ma réponse pour refléter cela – Arvo

0

Dans SQL Server, il serait:

ALTER TABLE tblLogs ALTER COLONNE date_created DEFAULT getDate()

-1

Je propose que pour créer ou restructurer des tables de Jet, vous utilisez DAO au lieu de DDL. Il offre la possibilité de contrôler les propriétés qui manquent dans l'implémentation de DDL par Jet. L'aide d'Access devrait vous fournir ce dont vous avez besoin.

+0

Ces "propriétés qui manquent dans l'implémentation de DDL de Jet" sont plutôt obscures (ne les utilisez-vous jamais?!) Et n'incluent certainement pas DEFAULT! Mais l'OP a aussi demandé un VBA alors pourquoi ne pas poster vos nombreuses lignes de code DAO équivalent pour voir si elles préfèrent soit la ligne unique de DDL SQL ou une seule ligne de code Access + ADO? :) – onedaywhen

+0

Je ne crée pas de tables dans le code de n'importe quelle forme. Je ne vois pas le point. –

+0

Quelle que soit la manière dont vous créez les tables, utilisez-vous explicitement ces "propriétés qui manquent dans l'implémentation de DDL de Jet"? – onedaywhen

Questions connexes