Est-il possible de créer plusieurs instructions d'insertion dans une requête ms-access?

StackOverflow https://stackoverflow.com/questions/62504

  •  09-06-2019
  •  | 
  •  

Question

J'utilise MS Access 2003. Je souhaite exécuter beaucoup d'instructions SQL d'insertion dans ce que l'on appelle "Requête" dans MS Access. Y a-t-il un moyen facile (ou même un moyen) de le faire?

Était-ce utile?

La solution

oui et non.

Vous ne pouvez pas faire:

insert into foo (c1, c2, c3)
values ("v1a", "v2a", "v3a"),
       ("v1b", "v2b", "v3b"),
       ("v1c", "v2c", "v3c")

mais vous pouvez le faire

insert into foo (c1, c2, c3)
    select (v1, v2, v3) from bar

Qu'est-ce que cela vous donne si vous n'avez pas déjà les données dans un tableau? Eh bien, vous pouvez créer une instruction Select composée de nombreuses unions de Selects avec des résultats codés en dur.

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

Remarque: je dois également inclure une sorte de table factice (par exemple, une seule fois) pour tromper l'accès en autorisant l'union (elle doit contenir au moins une ligne) et vous devez disposer de la valeur "Top 1". pour vous assurer que vous n'obtenez pas de répétitions pour une table comportant plusieurs lignes

Mais là encore, il serait probablement plus facile de faire trois déclarations d’insertion séparées, surtout si vous construisez déjà des choses en boucle (à moins bien sûr que le coût des inserts soit supérieur au coût de votre temps pour le coder).

Autres conseils

Personnellement, je créerais un sous-programme VBA et me connecterais à la base de données à l'aide d'une forme de connexion SQL.

Le code pour le faire devrait ressembler à quelque chose comme:

Sub InsertLots ()
    Dim SqlConn as Connection
    SqlConn.Connect("your connection string")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (1, 2)")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (2, 3)")
    SqlConn.Close()
End Sub

Je pense qu'il est déconseillé de proposer une interface de données particulière, comme le fait Jonathan, lorsque vous n'avez pas précisé le contexte dans lequel le code va être exécuté.

Si le magasin de données est une base de données Jet, il est peu judicieux d’utiliser une forme quelconque d’ADO, à moins que vous n’exécutiez votre code à partir d’une plate-forme de script pour laquelle il s’agit du choix préféré. Si vous êtes dans Access, ce n’est certainement pas le cas et DAO est l’interface privilégiée.

Non - une requête dans Access est une instruction SQL unique. Il est impossible de créer un lot de plusieurs instructions dans un même objet de requête. Vous pouvez créer plusieurs objets de requête et les exécuter à partir d'une macro / module.

@Rik Garner: Vous ne savez pas ce que vous entendez par «lot», mais le

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)
La construction

, bien qu’il s’agisse d’une seule instruction SQL , insérera chaque ligne une par une (plutôt que toutes en même temps) mais dans la même transaction: vous pouvez le tester en ajoutant une contrainte pertinente par exemple

ALTER TABLE foo ADD
   CONSTRAINT max_two_foo_rows
      CHECK (2 >= (SELECT COUNT(*) FROM foo AS T2));

En supposant que la table est vide, le INSERT INTO..SELECT .. ci-dessus devrait fonctionner: le fait que cela ne fonctionne pas, c'est que la contrainte a été vérifiée après l'insertion de la première ligne les trois ont été insérés (une violation de la norme ANSI SQL-92 mais c'est MS Access pour vous); le fait que la table reste vide indique que la transaction interne a été annulée.

@David W. Fenton: vous avez peut-être une préférence personnelle forte pour DAO, mais ne soyez pas trop dur envers quelqu'un qui choisit une technologie alternative d'accès aux données (dans ce cas, ADO), en particulier pour une solution vanille INSERT et quand ils qualifient leurs commentaires avec, " Le code pour le faire devrait ressembler à quelque chose comme & # 8230; " Après tout, vous ne pouvez pas utiliser DAO pour créer une contrainte CHECK :)

MS Access n'autorise pas les insertions multiples à partir de la même fenêtre SQL. Si vous souhaitez insérer , dites 10 lignes dans la table , dites film (mid, mname, mdirector, ....). , vous devez ouvrez les fenêtres SQL,

  1. tapez le 1er stmt, exécutez le 1er stmt, supprimez le 1er stmt
  2. tapez le 2e stmt, exécutez le 2e stmt, supprimez le 2e stmt
  3. tapez le 3ème stmt, exécutez le 3ème stmt, supprimez le 3ème stmt ......

Très ennuyeux. Au lieu de cela, vous pouvez importer les lignes d'Excel en procédant comme suit:

  1. Cliquez avec le bouton droit sur le nom de la table que vous avez déjà créé
  2. Importer à partir d'Excel (la boîte de dialogue Importer est ouverte)
  3. Accédez au fichier Excel contenant les enregistrements à importer dans la table
  4. Cliquez sur "Ajouter une copie des enregistrements à la table:"
  5. .
  6. Sélectionnez la table requise (dans cet exemple de film)
  7. Cliquez sur "OK".
  8. Sélectionnez la feuille de calcul contenant les données de la feuille de calcul
  9. cliquez sur Terminer

L'ensemble du jeu de données dans Excel a été chargé dans la table "MOVIE"

.

MS Access peut également ajouter des données à une table à partir d'un simple fichier texte. CSV les valeurs (j’ai simplement utilisé la case Remplacer tout pour tout supprimer sauf les virgules) et sous Données externes, sélectionnez le fichier texte.

From this:
INSERT INTO CLASS VALUES('10012','ACCT-211','1','MWF 8:00-8:50 a.m.','BUS311','105');
INSERT INTO CLASS VALUES('10013','ACCT-211','2','MWF 9:00-9:50 a.m.','BUS200','105');
INSERT INTO CLASS VALUES('10014','ACCT-211','3','TTh 2:30-3:45 p.m.','BUS252','342');
To this:
10012,ACCT-211,1,MWF 8:00-8:50 a.m.,BUS311,105
10013,ACCT-211,2,MWF 9:00-9:50 a.m.,BUS200,105
10014,ACCT-211,3,TTh 2:30-3:45 p.m.,BUS252,342
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top