Gibt es eine Möglichkeit, mehrere Einfügeanweisungen in einer MS-Access-Abfrage zu erstellen?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich verwende MS Access 2003. Ich möchte viele SQL -Anweisungen in der sogenannten "Abfrage" in MS Access ausführen. Gibt es eine einfache (oder in der Tat), dies zu tun?

War es hilfreich?

Lösung

Ja und nein.

Sie können nicht:

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

Aber du kannst es tun

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

Was bringt Sie von Ihnen, wenn Sie die Daten noch nicht in einer Tabelle haben? Nun, Sie können eine ausgewählte Anweisung aus vielen Gewerkschaften von Auswahl mit hart codierten Ergebnissen erstellen.

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)

HINWEIS: Ich muss auch eine Form eines Dummy -Tisches (z. B. Onerow) einfügen, um Zugriff auf die Gewerkschaft zu ermöglichen (es muss mindestens eine Reihe enthalten), und Sie benötigen die "Top 1", um sicherzustellen, dass Sie Don Don Don haben Ich werde keine Wiederholungen für eine Tabelle mit mehr als einer Zeile erhalten

Andererseits wäre es wahrscheinlich einfacher, nur drei separate Einfügungsanweisungen auszuführen, insbesondere wenn Sie bereits in einer Schleife aufbauen (es sei denn natürlich, die Kosten für die Durchführung der Einsätze sind größer als die Kosten Ihrer Zeit, um es zu codieren). .

Andere Tipps

Persönlich würde ich ein VBA -Unterprogramm für die Datenbank erstellen und mit einer Form der SQL -Verbindung eine Verbindung zur Datenbank herstellen.

Ab meinem Kopf sollte der Code zu tun, um es aussehen zu lassen:

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

Ich denke, es ist nicht ratsam, eine bestimmte Datenschnittstelle vorzuschlagen, wie es Jonathan tut, wenn Sie den Kontext, in dem der Code ausgeführt wird, nicht geklärt hat.

Wenn es sich bei dem Datenspeicher um eine Jet -Datenbank handelt, ist es wenig sinnvoll, eine beliebige Form von ADO zu verwenden, es sei denn, Sie führen Ihren Code von einer Skriptplattform aus, auf der es sich um die bevorzugte Wahl handelt. Wenn Sie Zugriff haben, ist dies definitiv nicht der Fall, und DAO ist die bevorzugte Schnittstelle.

Nein - Eine Abfrage im Zugriff ist eine einzelne SQL -Anweisung. Es gibt keine Möglichkeit, eine Stapel mehrerer Aussagen innerhalb eines Abfragungsobjekts zu erstellen. Sie können mehrere Abfrageobjekte erstellen und aus einem Makro/Modul ausführen.

@Rik garner: Ich bin mir nicht sicher, was du mit 'Batch' meinst, aber die

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)

Konstrukte, obwohl es sich um eine einzelne SQL handelt Aussage, wird tatsächlich jede Zeile nacheinander (und nicht auf einmal auf einmal) einfügen, aber in derselben Transaktion: Sie können dies testen, indem Sie eine relevante Einschränkung z.

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

Angenommen, die Tabelle ist leer, die oben genannten INSERT INTO..SELECT.. Sollte funktionieren: Die Tatsache ist nicht daran, dass die Einschränkung nach dem Einfügen der ersten Zeile überprüft wurde und nicht nach allen drei eingefügt wurde (ein Verstoß gegen ANSI SQL-92, aber das ist MS-Zugriff für Sie); Die Tatsache, dass die Tabelle leer bleibt, zeigt, dass die interne Transaktion zurückgerollt wurde.

@David W. Fenton: Sie haben möglicherweise eine starke persönliche Präferenz für DAO, aber bitte sind Sie nicht zu hart an jemanden, wenn Sie eine alternative Datenzugriffstechnologie (in diesem Fall ADO) auswählen, insbesondere für eine Vanille INSERT Und wenn sie ihre Kommentare mit "von der Spitze meines Kopfes" qualifizieren, sollte der Code dafür etwas aussehen wie ... "Sie können DAO doch nicht verwenden, um eine zu erstellen CHECK Einschränkung :)

MS Access erlaubt nicht mehrere Einfügen aus demselben SQL -Fenster. Wenn Sie wollen Einfügung, sagen 10 Zeilen in der Tabelle, sagen Film (Mid, Mname, Mdirector, ....), Sie müssten die SQL -Fenster öffnen.

  1. Geben Sie den 1. STMT ein, führen Sie 1. STMT aus, löschen Sie 1. STMT
  2. Geben Sie den 2. STMT ein, geben Sie 2. STMT aus, löschen Sie 2. STMT
  3. Geben Sie den 3. STMT ein, führen Sie den 3. STMT aus, löschen Sie 3. STMT ......

Sehr langweilig. Stattdessen können Sie die Zeilen von Excel importieren, indem Sie:

  1. Klicken Sie mit der rechten Maustaste auf den Tabellennamen, den Sie bereits erstellt haben
  2. Importieren aus Excel (Dialogfeld importieren wird geöffnet)
  3. Durchsuchen Sie die Excel -Datei, die die in der Tabelle importierten Datensätze enthält
  4. Klicken Sie auf "Eine Kopie der Datensätze an die Tabelle anhängen:"
  5. Wählen Sie die erforderliche Tabelle aus (in diesem Beispielfilm)
  6. Klicken Sie auf "OK"
  7. Wählen Sie das Arbeitsblatt aus, das die Daten in der Tabelle enthält
  8. Klicken Sie auf Fertig stellen

Der gesamte Datensatz in der Excel wurde in den "Film" in der Tabelle geladen.

MS Access kann auch Daten aus einer einfachen Textdatei in eine Tabelle anhängen. CSV Die Werte (ich habe einfach das Ersetzen des gesamten Feldes verwendet, um alle bis auf die Kommas zu löschen) und unter externen Daten die Textdatei auswählen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top