web-development-kb-es.site

¿Hay alguna forma de crear múltiples declaraciones de inserción en una consulta de acceso a ms?

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?

13
Varun Mahajan

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) .

34
BIBD

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
3
Jonathan

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.

2
David-W-Fenton

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,

  1. escriba el primer stmt, ejecute el primer stmt, elimine el primer stmt
  2. escriba el segundo stmt, ejecute el segundo stmt, elimine el segundo stmt
  3. escriba el tercer stmt, ejecute el tercer stmt, elimine el tercer stmt ...

Muy aburrido. En su lugar, puede importar las líneas de Excel haciendo:

  1. Haga clic con el botón derecho en el nombre de la tabla que ya ha creado
  2. Importar desde Excel (se abre el cuadro de diálogo Importar)
  3. Busque el archivo de Excel que contiene los registros que se importarán en la tabla
  4. Haga clic en "Agregar una copia de los registros a la tabla":
  5. Seleccione la tabla requerida (en esta película de ejemplo)
  6. Haga clic en "Aceptar"
  7. Seleccione la hoja de trabajo que contiene los datos en la hoja de cálculo
  8. Haga clic en Finalizar

El conjunto de datos completo en Excel se ha cargado en la tabla "PELÍCULA"

2
user2129206

@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 :)

1
onedaywhen

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.

1
Rikalous

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
1
Mark