trabajando seleccion hacer criterios crear creacion consultas consulta con como acces ms-access

ms-access - seleccion - crear consulta sql en access 2016



¿Hay alguna forma de crear múltiples instrucciones de inserción en una consulta de acceso de ms? (7)

Estoy usando MS Access 2003. Quiero ejecutar una gran cantidad de insertar sentencias SQL en lo que se llama ''Query'' en MS Access. ¿Hay alguna forma fácil (o de hecho) de hacerlo?


No, una consulta en Access es una sola instrucción SQL. No hay forma de crear un lote de varias instrucciones dentro de un objeto de consulta. Puede crear múltiples objetos de consulta y ejecutarlos desde una macro / módulo.


Personalmente, crearía una subrutina VBA para hacerlo, y me conectaría a la base de datos usando alguna forma de conexión sql.

Fuera de mi cabeza, el código para hacerlo debería verse más o menos 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


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

constructo, aunque es una sola instrucción SQL, insertará cada fila de a una por vez (en lugar de todas a la vez) pero en la misma transacción: puede probar esto agregando una restricción relevante, por ejemplo

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 no es porque la restricción se verificó después de insertar la primera fila en lugar de después de que se insertaron las tres (una violación de ANSI SQL -92 pero eso es MS Access para ti); el hecho de que la tabla permanezca vacía muestra que la transacción interna fue retrotraída.

@David W. Fenton: es posible que tengas una fuerte preferencia personal por DAO, pero no seas tan duro con alguien para elegir una tecnología de acceso a datos alternativa (en este caso ADO), especialmente para un INSERT vainilla y cuando califiquen sus comentarios con , "Fuera de mi cabeza, el código para hacerlo debería ser algo así como ..." Después de todo, no puedes usar DAO para crear una restricción CHECK :)


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 ejecutará el código.

Si el almacén de datos es una base de datos de Jet, tiene poco sentido utilizar cualquier forma de ADO a menos que esté ejecutando su código desde una plataforma de scripts donde es la opción preferida. Si está en Access, definitivamente este no es el caso, y DAO es la interfaz preferida.


si y no.

No puedes hacer:

insert into foo (c1, c2, c3) values ("v1a", "v2a", "v3a"), ("v1b", "v2b", "v3b"), ("v1c", "v2c", "v3c")

pero puedes hacer

insert into foo (c1, c2, c3) select (v1, v2, v3) from bar

¿Qué significa eso si aún no tienes los datos en una tabla? Bien, podría crear una instrucción Select compuesta de muchas uniones de Selects con resultados codificados.

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 alguna forma 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 no se repite para una tabla con más de una fila

Pero, de nuevo, probablemente sería más fácil simplemente hacer tres instrucciones de inserción separadas, especialmente si ya está creando cosas en un bucle (a menos, por supuesto, que el costo de hacer los insertos sea mayor que el costo de su tiempo para codificarlo). .


MS Access no permite insertar múltiples desde la misma ventana sql. Si desea insertar , digamos 10 filas en la tabla , digamos movie (mid, mname, mdirector, ....) , necesitaría abrir las ventanas sql,

  1. escriba el primer stmt, ejecute 1st stmt, elimine 1st stmt
  2. escriba el segundo stmt, ejecute 2nd stmt, elimine el segundo stmt
  3. escriba el 3er stmt, ejecute 3rd stmt, elimine 3rd stmt ......

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

  1. Haga clic 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 este ejemplo de película)
  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 "MOVIE"


MS Access también puede agregar datos en una tabla desde un archivo de texto simple. CSV los valores (simplemente utilicé el cuadro Reemplazar todo para eliminar todos los 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