2009-12-03 15 views
35

Mam plik tekstowy z kilkoma instrukcjami SQL, które chcę uruchomić w bazie danych programu Access. Pomyślałem, że to powinno być możliwe dzięki Access'owi Edytor zapytań. Więc idę do tego edytora i wklej sprawozdań:Jak wykonać wiele instrukcji SQL w programie Access 'Query Editor?

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

próbując je uruchomić (naciskając czerwony wykrzyknik) Otrzymuję
Missing semicolon (;) at end of SQL statement.

To może być traktowane jako wskazanie, że edytor pozwoliłby na wykonywanie wielu wyciągów . Więc zmienić oświadczenia i dołączyć taki średnik na końcu:

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

następnie uzyskać
Characters found after end of SQL statement.
które prawdopodobnie mogłyby być traktowane jako wskazanie, że nie jest możliwe wykonać wiele instrukcji .

Ok, więc pytanie: czy jest to możliwe do wykonania wielu instrukcji w edytorze zapytania, czy jest to możliwe, aby w jakiś sposób periodyczny wykonać instrukcje SQL w pliku w/na/przed dostępem .

Dzięki/Rene

edit Sprawozdania wkładane były wykorzystywane jako przykład i zdaję sobie sprawę, że są one mniej niż doskonały, ponieważ wszystkie one trafiają do tej samej tabeli i takie coś może oczywiście być jakoś rozwiązany przez używając jednego zdania, które ma związek lub coś takiego. W moim rzeczywistym przypadku, który próbuję rozwiązać, plik zawiera nie tylko instrukcje wstawiania, ale także tworzenie instrukcji tabel i instrukcji wstawiania z różnymi tabelami podstawowymi. Miałem więc nadzieję (i nadal mam nadzieję), że istnieje coś takiego jak mój ukochany SQL * Plus dla Oracle, który może wykonać plik z wszelkiego rodzaju instrukcjami SQL.

Odpowiedz

28

Możesz łatwo napisać kod bitowy, który zostanie odczytany w pliku. Możesz przyjąć jedną instrukcję SQL na linię lub założyć;

Więc zakładając, że masz plik tekstowy, takie jak:

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

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


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

Zanotować w powyższym pliku tekstowego możemy uwolnić mieć SQL na więcej niż jednej linii.

kod można użyć do odczytu + uruchomić powyższy skrypt jest:

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 

Można rozszerzyć na umieszczenie jakiś błąd msg jeżeli jedna instrukcja nie działają, takie jak

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

Bez względu na to, powyższe dzielenie() i odczytywanie ciągu znaków powoduje, że twój sql może znajdować się w więcej niż jednej linii ...

+1

Dlaczego warto używać zmiennej typu Variant? Po prostu możesz pominąć użycie licznika UBound()? Kiedy po raz pierwszy to zobaczyłem, pomyślałem, że wygląda jak kod od uchodźcy, który nie był w Accessie, a potem widzę, że to od ciebie, Albercie. Nigdy nie zrobiłbym tego w ten sposób. Rozdzielam łańcuchy, więc tablica powinna być typu string, moim zdaniem. –

+0

@ David W. Fenton - "Po co używać zmiennej typu Variant?" - czasami VBA nie daje ci dużego wyboru, a to jest jedna z nich. Zaletą używania Split i For Each jest to, że kod jest IMO bardziej czytelny ... ale to kwestia gustu. Zauważam, że częściej niż nie pomijasz słów kluczowych ByVal/ByRef, co skutkuje domniemaniem ByRef, podczas gdy bardziej bezpośrednie by ByVal byłoby bardziej odpowiednie. Ale tylko kwestia gustu, bez wielkoduszności. – onedaywhen

+1

Tak dla każdego sposobu nie używam polecenia ubound(). Zapisuje również deklaracyjny licznik pętli for/next. Uważam, że jest to trochę mniej pisania i nie muszę używać odwołań do tablicy, takich jak vSql (I). A także w miejsce "Dalej I" mogę użyć: "Dalej" (dzięki czemu mogę zmienić użytą zmienną, ale i mniej innych miejsc w kodzie, jeśli zmienisz nazwę używanego var). "dla każdego" var musi być wariantem, jednak tablica (jak wskazuje Dave) naprawdę powinna była zostać zadeklarowana jako tablica ciągów znaków Dim vSql() jako ciąg –

12

Niestety, w AFAIK nie można uruchamiać wielu instrukcji SQL pod jednym nazwanym zapytaniem w programie Access w tradycyjnym znaczeniu.

Możesz wykonać kilka zapytań, a następnie połączyć je razem z VBA (DoCmd.OpenQuery, jeśli pamięć działa).

Możesz również napisać kilka rzeczy razem z UNION jeśli chcesz.

0

Być może lepszym rozwiązaniem będzie użycie programu innej firmy do wprowadzania zapytań w programie Access, takich jak WinSQL Myślę, że z pamięci WinSQL supports multiple queries za pomocą funkcji wsadowej.

Ostatecznie okazało się, że łatwiej jest napisać program w Perlu, aby wykonać zbiorcze INSERTY w Access za pośrednictwem ODBC. Możesz użyć vbscript lub dowolnego języka obsługującego ODBC.

Możesz wtedy zrobić wszystko, co chcesz i mieć własną skomplikowaną logikę do obsługi importowania.

+1

WinSQL Lite jest bezpłatny, ale Dev i Pro nie są .. zobacz [porównaj] (http://web.synametrics.com/WinSQLFeatures.htm) – itsho

+0

robi nie wykonuj wielu instrukcji wobec dostępu. – Marc

+0

Czy próbowałeś funkcji terminatora zapytań? –

0

Lepiej po prostu utwórz plik XLSX z nazwami pól w górnym wierszu. Utwórz go ręcznie lub przy użyciu programu Mockaroo. Wyeksportuj go do programu Excel (lub pliku CSV), a następnie zaimportuj do programu Access przy użyciu nowego źródła danych -> Z pliku

IMHO to najlepszy i najbardziej wydajny sposób na zrobienie tego w programie Access.

+0

Nie mogę edytować XLX S pliki z vimem, więc nie jest to opcja dla mnie. –

Powiązane problemy