Esiste un modo per creare più istruzioni di inserimento in una query MS-Access?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Sto usando MS Access 2003.Voglio eseguire molte istruzioni SQL di inserimento in quella che viene chiamata "Query" in MS Access.Esiste un modo semplice (o addirittura un modo) per farlo?

È stato utile?

Soluzione

sì e no.

Non puoi fare:

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

ma puoi farlo

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

Cosa ti porta se non hai già i dati in una tabella?Bene, potresti creare un'istruzione Select composta da molte unioni di Select con risultati codificati.

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)

Nota:Devo anche includere una qualche forma di tabella fittizia (ad esempio, una riga) per ingannare l'accesso e consentire l'unione (deve contenere almeno una riga) e hai bisogno della "prima riga" per assicurarti di non farlo ottenere ripetizioni per una tabella con più di una riga

Ma ancora una volta, sarebbe probabilmente più facile fare tre dichiarazioni di inserto separate, soprattutto se stai già costruendo le cose in un ciclo (a meno che ovviamente il costo di fare gli inserti sia maggiore del costo del tuo tempo per codificarlo) .

Altri suggerimenti

Personalmente, creerei una subroutine VBA per farlo e mi collegherei al database utilizzando una qualche forma di connessione SQL.

A prima vista, il codice per farlo dovrebbe assomigliare a qualcosa del tipo:

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

Penso che sia sconsigliabile proporre una particolare interfaccia dati, come fa Jonathan, quando non si è chiarito il contesto in cui verrà eseguito il codice.

Se l'archivio dati è un database Jet, non ha molto senso utilizzare qualsiasi forma di ADO a meno che non si esegua il codice da una piattaforma di scripting in cui è la scelta preferita.Se utilizzi Access, non è assolutamente così e DAO è l'interfaccia preferita.

No: una query in Access è una singola istruzione SQL.Non è possibile creare un batch di più istruzioni all'interno di un oggetto query.È possibile creare più oggetti query ed eseguirli da una macro/modulo.

@Rik Garner:Non sono sicuro di cosa intendi per "lotto", ma il file

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)

costrutto, pur essendo un singolo SQL dichiarazione, inserirà effettivamente ciascuna riga una alla volta (anziché tutte in una volta) ma nella stessa transazione:puoi testarlo aggiungendo un vincolo pertinente, ad es.

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

Supponendo che la tabella sia vuota, vale quanto sopra INSERT INTO..SELECT.. dovrebbe funzionare:il fatto che non sia così è perché il vincolo è stato controllato dopo che è stata inserita la prima riga anziché dopo che sono state inserite tutte e tre (una violazione di ANSI SQL-92 ma questo è MS Access per te);il fatto che la tabella rimanga vuota indica che è stato eseguito il rollback della transazione interna.

@David W.Fentone:potresti avere una forte preferenza personale per DAO, ma per favore non essere troppo duro con qualcuno nella scelta di una tecnologia di accesso ai dati alternativa (in questo caso ADO), soprattutto per un sistema vanilla INSERT e quando qualificano i loro commenti con "In cima alla mia testa, il codice per farlo dovrebbe assomigliare a qualcosa del genere..." Dopo tutto, non puoi usare DAO per creare un CHECK vincolo :)

MS Access non consente l'inserimento multiplo dalla stessa finestra SQL.Se lo desidera inserire, Dire 10 righe nella tabella, Dire film (mid, mnome, mdirettore,....), dovresti aprire le finestre SQL,

  1. digitare il primo stmt, eseguire il 1° stmt, eliminare il 1° stmt
  2. digitare il 2° stmt, eseguire il 2° stmt, eliminare il 2° stmt
  3. digita il 3° stmt, esegui il 3° stmt, cancella il 3° stmt ......

Molto noioso.Invece potresti importare le righe da Excel facendo:

  1. Fai clic con il pulsante destro del mouse sul nome della tabella che hai già creato
  2. Importa da Excel (si apre la finestra di dialogo Importa)
  3. Individuare il file Excel contenente i record da importare nella tabella
  4. Fare clic su "Aggiungi una copia dei record alla tabella:"
  5. Seleziona la tabella richiesta (in questo filmato di esempio)
  6. Fare clic su "OK"
  7. Seleziona il foglio di lavoro che contiene i dati nel foglio di calcolo
  8. Fare clic su Fine

L'intero set di dati in Excel è stato caricato nella tabella "MOVIE"

MS Access può anche aggiungere dati in una tabella da un semplice file di testo.CSV i valori (ho semplicemente usato la casella Sostituisci tutto per eliminare tutto tranne le virgole) e in Dati esterni seleziona File di testo.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top