2009-12-03 152 views
35

Tengo un archivo de texto con algunas declaraciones SQL que quiero ejecutar en una base de datos de Access. Pensé que debería ser posible con Access ' Query Editor. Por lo tanto, que entro en este editor y pegar las instrucciones:¿Cómo ejecuto múltiples instrucciones SQL en 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') 

Intentar ejecutar ellos (por golpear el signo de exclamación rojo) recibo una
Missing semicolon (;) at end of SQL statement.

Esto podría tomarse como una indicación de que la editor permitiría ejecutar declaraciones múltiples. Por lo tanto, yo cambio las declaraciones y añadir un punto y coma tales al final:

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

cuando me siento un
Characters found after end of SQL statement.
que probablemente podría tomarse como una indicación de que no es posible para ejecutar varias instrucciones .

Ok, así que la pregunta: ¿es posible ejecutar varias instrucciones en el editor consulta, o es posible de alguna manera por lotes ejecutar sentencias SQL en un archivo en /Access en/contra.

Gracias/René

edición Las instrucciones de inserción se utilizaron como ejemplo y que se dan cuenta de que son menos que perfecta, porque todos van a la misma mesa y tal cosa puede, obviamente, de alguna manera ser resueltos por usando una declaración que tiene una unión o algo. En mi caso real que trato de resolver, el archivo no solo contiene instrucciones de inserción, sino también crea declaraciones de tabla e inserta instrucciones con diferentes tablas subyacentes. Así que esperaba (y todavía espero) que haya algo así como mi amado SQL * Plus para Oracle que pueda ejecutar un archivo con todo tipo de declaraciones SQL.

Respuesta

28

Puede escribir fácilmente un código de bit que se leerá en un archivo. Puede asumir un enunciado sql por línea o asumir el;

Así, suponiendo que tiene un archivo de texto como:

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

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


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

Nota del archivo en el texto anterior nos libre de tener sentencias SQL en más de una línea.

el código que puede utilizar para leer + ejecutar la secuencia anterior es:

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 

Se podría ampliar en la colocación de algunos msg de error si la declaración no funcionan, como

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

Independientemente, la división() y la lectura de cadena anteriores permiten que su sql esté en más de una línea ...

+1

¿Por qué usar una variable de tipo Variant? Solo para que pueda saltarse el uso de un contador y UBound()? Cuando lo vi por primera vez, pensé que se parecía al código de un refugiado que no era de Access, y luego veo que es de usted, Albert. Nunca lo haría de esta manera. Estoy dividiendo cadenas, por lo que la matriz debería ser de tipo cadena, en mi opinión. –

+0

@David W. Fenton - "¿Por qué usar una variable de tipo Variant?" - a veces VBA no le da mucha opción en el asunto y este es uno de ellos. El beneficio de usar Split y For Each es que el código es IMO más legible ... pero esa es una cuestión de gusto. Noto que a menudo omite las palabras clave ByVal/ByRef, lo que resulta en ByRef implícito, mientras que ByVal explícito sería más apropiado. Pero solo una cuestión de gusto, no es gran cosa. – onedaywhen

+1

Sí para cada medio que no uso el comando ubound(). También guarda el contador de declaraciones para el ciclo for/next. Me parece un poco menos tipeo y no tengo que usar una matriz de referencias como vSql (I). Y, también en lugar de "Siguiente I" puedo usar: "Siguiente" (así puedo cambiar la variable utilizada pero y menos otros lugares en el código efectuado si renombra la var). "para cada" var tiene que ser una variante; sin embargo, la matriz (como señala Dave) realmente debería haberse declarado un conjunto de cadenas Dim vSql() Como cadena –

12

Desafortunadamente, AFAIK no puede ejecutar múltiples sentencias SQL bajo una consulta con nombre en Access en el sentido tradicional.

Puede realizar varias consultas y, a continuación, encadenarlas junto con VBA (DoCmd.OpenQuery si la memoria sirve).

También puede unir muchas cosas con UNION si lo desea.

0

Puede ser mejor utilizar un programa de terceros para ingresar las consultas en Access como WinSQL Creo que desde la memoria WinSQL supports multiple queries a través de su función por lotes.

Finalmente me pareció más fácil escribir un programa en perl para hacer inserciones masivas en un acceso a través de ODBC. Sin embargo, podría usar vbscript o cualquier lenguaje que admita ODBC.

Puede hacer lo que quiera y tener su propia lógica complicada para manejar la importación.

+1

WinSQL Lite es gratuito, pero Dev y Pro no lo son. vea [compare] (http://web.synametrics.com/WinSQLFeatures.htm) – itsho

+0

hace no ejecutar varias sentencias contra Access. – Marc

+0

¿Ha intentado la función de terminador de consulta? –

0

Mejor solo crea un archivo XLSX con los nombres de los campos en la fila superior. Crearlo manualmente o usando Mockaroo. Exportarlo a Excel (o CSV) y luego importarlo a Access usando New Data Source -> From File

En mi humilde opinión, es la mejor y más eficiente forma de hacerlo en Access.

+0

No puedo editar XLX S archivos con vim, por lo que no es una opción para mí. –