Estoy usando MS Access 2003. Quiero ejecutar muchas declaraciones SQL de inserción en lo que se llama 'Consulta' en MS Access. ¿Hay alguna forma fácil (o de hecho alguna) de hacerlo?
si y no.
No puedes hacer:
insert into foo (c1, c2, c3)
values ("v1a", "v2a", "v3a"),
("v1b", "v2b", "v3b"),
("v1c", "v2c", "v3c")
pero tu puedes hacer
insert into foo (c1, c2, c3)
select (v1, v2, v3) from bar
¿Qué le proporciona eso si aún no tiene los datos en una tabla? Bueno, podría elaborar una declaración de selección compuesta por muchas uniones de selecciones con resultados codificados de forma rígida.
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: también tengo que incluir algún tipo de tabla ficticia (por ejemplo, onerow) para engañar el acceso y permitir la unión (debe tener al menos una fila), y necesita el "top 1" para asegurarse de no obtengo repeticiones para una tabla con más de una fila
Pero, de nuevo, probablemente sería más fácil hacer tres declaraciones de inserción separadas, especialmente si ya está construyendo cosas en un bucle (a menos que, por supuesto, el costo de hacer las inserciones sea mayor que el costo de su tiempo para codificarlas) .
Personalmente, crearía una subrutina VBA para hacerlo y me conectaría a la base de datos usando algún tipo de conexión SQL.
En la parte superior de mi cabeza, el código para hacerlo debería verse así:
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
Creo que no es aconsejable proponer una interfaz de datos en particular, como lo hace Jonathan, cuando no se ha aclarado el contexto en el que se va a ejecutar el código.
Si el almacén de datos es una base de datos Jet, tiene poco sentido usar cualquier forma de ADO a menos que esté ejecutando su código desde una plataforma de scripting donde es la opción preferida. Access, definitivamente este no es el caso, y DAO es la interfaz preferida.
MS Access no permite múltiples inserciones desde la misma ventana sql. Si desea insertar , digamos 10 filas en la tabla, digamos película (mid, mname, mdirector, ....), necesitaría abrir las ventanas sql,
Muy aburrido. En su lugar, puede importar las líneas de Excel haciendo:
El conjunto de datos completo en Excel se ha cargado en la tabla "PELÍCULA"
@Rik Garner: No estoy seguro de lo que quiere decir con 'lote', pero el
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)
la construcción, aunque es un solo SQL declaración, en realidad insertará cada fila una a la vez (en lugar de todas a la vez) pero en la misma transacción: puede probar esto agregando una restricción relevante, p.
ALTER TABLE foo ADD
CONSTRAINT max_two_foo_rows
CHECK (2 >= (SELECT COUNT(*) FROM foo AS T2));
Suponiendo que la tabla está vacía, lo anterior INSERT INTO..SELECT..
debería funcionar: el hecho de que no funcione se debe a que la restricción se verificó después de insertar la primera fila en lugar de después de insertar las tres (una violación de ANSI SQL-92, pero eso es MS Access para usted); el hecho de que la tabla permanezca vacía muestra que la transacción interna se revirtió.
@David W. Fenton: es posible que tenga una fuerte preferencia personal por DAO, pero no sea demasiado duro con alguien para elegir una tecnología de acceso a datos alternativa (en este caso ADO), especialmente para un Vanilla INSERT
y cuándo califican sus comentarios con, "En la parte superior de mi cabeza, el código para hacerlo debería verse algo así como ..." Después de todo, no puedes usar DAO para crear una restricción CHECK
:)
No, una consulta en Access es una sola declaración SQL. No hay forma de crear un lote de varias declaraciones dentro de un objeto de consulta. Puede crear varios objetos de consulta y ejecutarlos desde una macro/módulo.
MS Access también puede agregar datos a una tabla desde un archivo de texto simple. CSV los valores (simplemente usé el cuadro Reemplazar todo para eliminar todo menos las comas) y en Datos externos seleccione el Archivo de texto.
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