2009-12-03 11 views
35

Ich habe eine Textdatei mit ein paar SQL-Anweisungen, die ich auf einer Access-Datenbank ausführen möchte. Ich dachte, das sollte mit Access ' Query Editor möglich sein. Also gehe ich in diesem Editor und fügen Sie die Anweisungen:Wie führe ich mehrere SQL-Anweisungen in Access 'Query Editor aus?

insert into aFewYears (yr) values ('2000') 
insert into aFewYears (yr) values ('2001') 
insert into aFewYears (yr) values ('2002') 
insert into aFewYears (yr) values ('2003') 

Der Versuch, sie zu laufen (mit dem roten Ausrufezeichen Schlagen) Ich erhalte eine
Missing semicolon (;) at end of SQL statement.

Dies als Hinweis darauf gewertet werden könnte, dass die Editor würde ermöglichen, mehrere Anweisungen auszuführen. Also, ich die Anweisungen ändern und fügen Sie ein solches Semikolon am Ende:

insert into aFewYears (yr) values ('2000'); 
insert into aFewYears (yr) values ('2001'); 
insert into aFewYears (yr) values ('2002'); 
insert into aFewYears (yr) values ('2003'); 

Dann bekomme ich eine
Characters found after end of SQL statement.
, die wahrscheinlich als Hinweis darauf gewertet werden könnte, dass es nicht möglich ist zu mehreren Anweisungen ausführen .

Ok, also die Frage: ist es möglich, im Abfrageeditor mehrere Anweisungen auszuführen, oder ist es möglich, sql-Anweisungen in einer Datei in/on/gegen Access in Stapelverarbeitung auszuführen.

Dank/Rene

bearbeiten Die Insert-Anweisungen als Beispiel verwendet wurden, und ich merke, dass sie weniger als perfekt, weil sie alle auf den gleichen Tisch gehen und so etwas kann natürlich irgendwie durch gelöst werden Verwenden einer Anweisung, die eine Union oder etwas hat. In meinem tatsächlichen Fall, den ich zu lösen versuche, enthält die Datei nicht nur insert-Anweisungen, sondern auch Tabellenanweisungen und fügt Anweisungen mit verschiedenen zugrunde liegenden Tabellen ein. Ich hoffte also (und hoffe immer noch), dass es so etwas wie meine geliebte SQL * Plus für Oracle gibt, die eine Datei mit allen Arten von SQL-Anweisungen ausführen kann.

Antwort

28

Sie können einfach einen Bitcode schreiben, der in einer Datei gelesen wird. Sie können entweder eine SQL-Anweisung pro Zeile annehmen oder annehmen;

Also, vorausgesetzt, Sie eine Textdatei haben, wie:

insert into tblTest (t1) values ('2000'); 

update tbltest set t1 = '2222' 
     where id = 5; 


insert into tblTest (t1,t2,t3) 
     values ('2001','2002','2003'); 

Notieren Sie sich die in der obigen Textdatei wir SQL-Anweisungen auf mehr als eine Linie haben, freizugeben.

der Code, den Sie + laufen zu lesen das Skript verwenden können, ist:

Sub SqlScripts() 

    Dim vSql  As Variant 
    Dim vSqls  As Variant 
    Dim strSql  As String 
    Dim intF  As Integer 

    intF = FreeFile() 
    Open "c:\sql.txt" For Input As #intF 
    strSql = input(LOF(intF), #intF) 
    Close intF 
    vSql = Split(strSql, ";") 

    On Error Resume Next 
    For Each vSqls In vSql 
     CurrentDb.Execute vSqls 
    Next 

End Sub 

Sie auf Platzierung einige Fehler msg erweitern könnte, wenn die eine Aussage nicht funktionieren, wie

if err.number <> 0 then 
    debug.print "sql err" & err.Descripiton & "-->" vSqls 
end dif 

Unabhängig davon, die oben genannten Split() und String lesen ermöglicht Ihren SQL in mehr als einer Zeile sein ...

+1

Warum eine Variable vom Typ Variant verwenden? Nur so können Sie mit einem Zähler ein UBound() überspringen? Als ich das zum ersten Mal gesehen habe, dachte ich, es sehe aus wie Code eines Nichtzugangsflüchtlings, und dann sehe ich, dass es von dir ist, Albert. Ich würde es nie so machen. Ich spalte Strings, daher sollte das Array meiner Meinung nach vom Typ String sein. –

+0

@David W. Fenton - "Warum eine Variable vom Typ Variant verwenden?" - manchmal VBA gibt Ihnen nicht viel Auswahl in der Sache und das ist einer von ihnen. Der Vorteil von Split und For Each ist, dass der Code IMO besser lesbar ist ... aber das ist eine Frage des Geschmacks. Ich bemerke, dass Sie die ByVal/ByRef-Schlüsselworte häufig weglassen, was zu implizitem ByRef führt, während expliziter ByVal angemessener wäre. Aber nur eine Frage des Geschmacks, kein Problem. – onedaywhen

+1

Ja für jedes Mittel verwende ich nicht ubound() Befehl. Es speichert auch Deklarationszähler für die For/Next-Schleife. Ich finde es ein bisschen weniger tippen und ich brauche keine Array-Referenzen wie vSql (I). Und auch anstelle von "Next I" kann ich folgendes verwenden: "Next" (also kann ich die verwendete Variable ändern und weniger andere Stellen im Code bewirken, wenn man die verwendete Var umbenennt). "für jede" Var muss Variante sein, jedoch sollte das Array (wie Dave hervorhebt) eigentlich als String-Array deklariert werden. Dim vSql() Als String –

12

Leider AFAIK Sie können nicht mehrere SQL-Anweisungen unter einer benannten Abfrage in Access im herkömmlichen Sinne ausführen.

Sie können mehrere Abfragen erstellen und sie dann mit VBA zusammenführen (DoCmd.OpenQuery, wenn der Speicher dient).

Sie können auch eine Reihe von Dingen zusammen mit UNION zeichnen, wenn Sie möchten.

0

Sie könnten es besser finden, ein Drittanbieter-Programm verwenden, um die Abfragen in Access wie 012 eingebenIch denke aus dem Speicher WinSQL supports multiple queries über seine Batch-Funktion.

Ich fand es schließlich einfacher, nur ein Programm in Perl zu schreiben, um in einen Zugriff über ODBC INSERT Bulk zu tun. Sie können jedoch auch VBScript oder eine andere Sprache verwenden, die ODBC unterstützt.

Sie können dann alles tun, was Sie wollen und haben Ihre eigene komplizierte Logik, um den Import zu verarbeiten.

+1

WinSQL Lite ist kostenlos, aber Dev und Pro sind nicht. Siehe [Vergleichen] (http://web.synametrics.com/WinSQLFeatures.htm) – itsho

+0

tut nicht mehrere Anweisungen gegen Zugriff ausführen – Marc

+0

Haben Sie versucht, die Query Terminator-Funktion? –

0

Besser erstellen Sie einfach eine XLSX-Datei mit Feldnamen in der obersten Zeile. Erstellen Sie es manuell oder mit Mockaroo. Exportieren Sie es nach Excel (oder CSV) und importieren Sie es dann unter Verwendung neuer Datenquelle in Access -> Aus Datei

IMHO ist es der beste und performanteste Weg, um es in Access zu tun.

+0

Ich kann XLX nicht bearbeiten S Dateien mit vim, das ist also keine Option für mich. –

Verwandte Themen