2009-12-03 26 views
35

İçinde Access veritabanında çalıştırmak istediğim birkaç SQL deyimi olan bir metin dosyası var. Access ' Sorgu Düzenleyicisi ile mümkün olabileceğini düşündüm. Yani, bu düzenleyiciye gidin ve ifadeleri yapıştırın: Ben Bu olduğunun bir göstergesi olarak alınabilir bir
Missing semicolon (;) at end of SQL statement.Access 'Query Editor'da birden çok SQL ifadesini nasıl çalıştırırım?

almak

onları çalıştırmak çalışılıyor
insert into aFewYears (yr) values ('2000') 
insert into aFewYears (yr) values ('2001') 
insert into aFewYears (yr) values ('2002') 
insert into aFewYears (yr) values ('2003') 

(kırmızı ünlem işareti vurarak) editör çoklu ifadelerini çalıştırmaya izin verir. Yani, ifadeleri değiştirebilir ve sonunda böyle bir noktalı virgül ekleyin:

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

Sonra olsun bir olasılıkla birden çok ifade işlemeye mümkün değildir olduğunun bir göstergesi olarak alınabilir
Characters found after end of SQL statement.
. Tamam

, bu yüzden soru: sorgu editörü birden ifadeleri çalıştırmak mümkündür, ya da her nasılsa// tarihinde karşı Access'te bir dosyada sql ifadeleri toplu yürütmek mümkündür.

Teşekkür/Rene

düzenlemek insert ifadeleri örnek olarak kullanılmıştır ve hepsi aynı masaya gidip böyle bir şey tabii ki her nasılsa çözülebilir çünkü onlar mükemmel daha az olduğunu fark Birliği veya bir şeyi olan bir deyimi kullanarak. Çözmeyi denediğim gerçek durumumda, dosya yalnızca deyim eklemekle kalmaz, aynı zamanda tablo ifadeleri oluşturur ve altta yatan farklı tablolara sahip ifadeler ekler. Bu yüzden, her türlü SQL deyimiyle bir dosya çalıştırabilen sevgili SQL * Plus için Oracle gibi bir şey olduğunu umuyordum.

cevap

28

Bir dosyada okunacak bir bit kodu kolayca yazabilirsiniz. Satır başına bir sql ifadesi alabilir veya varsayabilir;

Yani, örneğin, bir metin dosyası var varsayarak:

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

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


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

Not daha sonra bir hat üzerinde sql ifadeleri var özgür yukarıdaki metin dosyasında.

sen + okumak yukarıdaki komut dosyasını çalıştırmak için kullanabileceğiniz koddur:

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 
tek bir deyim işe yaramazsa hata mesaj yerleştirerek genişletebilirdik

gibi

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

Yine de, yukarıdaki split() ve okunan dize, daha sonra bir satırda olmak için sql alow yapar ...

+1

Neden değişken türden bir değişken kullanır? Sadece bir UBound() kullanarak bir sayaç kullanarak atlayabilirsiniz? Bunu ilk gördüğümde, Access olmayan bir mültecinin koduna benzediğini düşündüm ve sonra senden Albert'i gör. Bunu asla böyle yapmam. Dizeleri bölüyorum, bu yüzden dizilim benim dizimde, yazı dizisi olmalı. –

+0

@David W. Fenton - "Neden varyant türünde bir değişken kullanıyorsunuz?" - Bazen VBA konuya çok fazla seçenek vermiyor ve bu onlardan biri. Split ve For Her kullanmanın yararı, kodun IMO daha okunabilir olmasıdır ... ama bu bir tat sorusu. ByVal/ByRef anahtar kelimelerini atlamamanız, dolaylı ByRef ile sonuçlanmamaktan ziyade açık bir şekilde ByVal'ın daha uygun olacağını fark edersiniz. Ama sadece bir tat meselesi, biggie yok. – onedaywhen

+1

Evet, her şey için ubound() komutunu kullanmadığım anlamına gelir. Ayrıca/sonraki döngü için bildiren sayacı kaydeder. Biraz daha az yazarak buluyorum ve vSql (I) gibi bir dizi referans kullanmak zorunda değilim. Ve, "Next I" in yerine de kullanabilirim: "Next" (böylece kullanılan değişkeni değiştirebilirim fakat kullanılan var olan adı yeniden isimlendirirseniz, koddaki daha az diğer yerleri değiştirebilirim). 0 "her" için "var" var, ancak dizi (As Dave'in işaret ettiği gibi) dize dizisi olarak bildirilmiş olmalıdır. Dim vSql() As String –

12

Maalesef, AFAIK, Access'te geleneksel anlamda birden çok SQL deyimini adlandırılmış sorgu altında çalıştıramazsınız.

Birkaç sorgu yapabilir, ardından bunları VBA ile birleştirebilirsiniz (bellek sunulduğunda DoCmd.OpenQuery).

İsterseniz bir çok şeyi UNION ile birleştirebilirsiniz.

0

012 gibi Access'e sorguları girmek için 3. parti programı kullanmak daha iyi olabilirBen parti özelliği üzerinden bellek WinSQL supports multiple queries düşünüyorum.

Nihayetinde, bir programın ODBC aracılığıyla bir Access'e toplu INSERTS yapmak için sadece bir program yazmasını daha kolay buldum. VBScript'i veya ODBC'yi destekleyen herhangi bir dili kullanabilirsiniz.

İstediğiniz her şeyi yapabilir ve içe aktarma işlemlerini gerçekleştirmek için kendi karmaşık mantığınıza sahip olabilirsiniz. Üst satırda alan adlarına sahip bir XLSX dosyası oluştursanız iyi olur.

+1

WinSQL Lite ücretsizdir, ancak Dev ve Pro değildir. bkz. [karşılaştır] (http://web.synametrics.com/WinSQLFeatures.htm) – itsho

+0

Access'e karşı çoklu ifadeler yürütme – Marc

+0

Sorgu sonlandırıcı işlevini denediniz mi? –

0

El ile veya Mockaroo kullanarak oluşturun. Excel'e (veya CSV'ye) verin ve sonra da Yeni Veri Kaynağı'nı kullanarak Access'e Aktar -> Dosyadan

IMHO, Access'te bunu yapmanın en iyi ve en iyi yoludur.

+0

XLX dosyasını düzenleyemiyorum Vim ile S dosyaları, bu yüzden benim için bir seçenek değil. –