16

我正在使用 MS Access 2003。我想在 MS Access 中的“查询”中运行大量插入 SQL 语句。有什么简单的(或确实有任何方法)可以做到吗?

4

8 回答 8

38

是和不是。

你不能这样做:

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

但你可以

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

如果您还没有表格中的数据,这会给您带来什么?好吧,您可以制作一个由许多带有硬编码结果的 Select 联合组成的 Select 语句。

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)

注意:我还必须包含某种形式的虚拟表(例如,onerow)以欺骗访问以允许联合(其中必须至少有一行),并且您需要“前 1”以确保您不'对于多于一行的表不会重复

但是话又说回来,只执行三个单独的插入语句可能会更容易,特别是如果您已经在循环中构建东西(当然,执行插入的成本大于编写代码的时间成本) .

于 2008-09-15T17:43:12.003 回答
4

就个人而言,我会创建一个 VBA 子例程来执行此操作,并使用某种形式的 sql 连接连接到数据库。

在我的脑海中,执行此操作的代码应该类似于:

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
于 2008-09-15T12:58:45.587 回答
2

我认为,当您还没有明确代码将在其中运行的上下文时,像 Jonathan 那样提出特定的数据接口是不可取的。

如果数据存储是 Jet 数据库,那么使用任何形式的 ADO 都毫无意义,除非您从首选的脚本平台运行代码。如果你在 Access 中,肯定不是这种情况,DAO 是首选接口。

于 2008-09-15T20:50:27.590 回答
2

MS Access 不允许从同一个 sql 窗口进行多次插入。如果要插入,例如表中的 10 行,例如电影 (mid, mname, mdirector,....),则需要打开 sql 窗口,

  1. 键入第一个 stmt,执行第一个 stmt,删除第一个 stmt
  2. 键入第 2 个 stmt,执行第 2 个 stmt,删除第 2 个 stmt
  3. 键入第 3 个 stmt,执行第 3 个 stmt,删除第 3 个 stmt ......

很无聊。相反,您可以通过执行以下操作从 excel 导入行:

  1. 右键单击您已经创建的表名
  2. 从 Excel 导入(打开导入对话框)
  3. 浏览到包含要在表中导入的记录的 excel 文件
  4. 单击“将记录的副本附加到表中:”
  5. 选择所需的表(在此示例电影中)
  6. 点击“确定”
  7. 选择包含电子表格中数据的工作表
  8. 点击完成

excel中的整个数据集已加载到“MOVIE”表中

于 2013-03-03T16:22:24.970 回答
1

否 - Access 中的查询是单个 SQL 语句。无法在一个查询对象中创建一批多条语句。您可以创建多个查询对象并从宏/模块运行它们。

于 2008-09-15T12:57:21.690 回答
1

@Rik Garner:不确定您所说的“批处理”是什么意思,但是

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)

构造,虽然是一个单独的 SQL语句,但实际上会一次插入每一行(而不是一次插入所有行),但在同一个事务中:您可以通过添加相关约束来测试这一点,例如

ALTER TABLE foo ADD
   CONSTRAINT max_two_foo_rows
      CHECK (2 >= (SELECT COUNT(*) FROM foo AS T2));

假设表是空的,上面INSERT INTO..SELECT..应该工作:事实上它不是因为在插入第一行之后检查约束,而不是在插入所有三个之后(违反 ANSI SQL-92,但这是 MS Access你 ); 表保持为空的事实表明内部事务已回滚。

@David W. Fenton:您可能对 DAO 有强烈的个人偏好,但请不要对某人选择替代数据访问技术(在本例中为 ADO)过于苛刻,特别是对于香草INSERT,当他们用以下方式限定他们的评论时, “在我的脑海中,执行它的代码应该看起来像......”毕竟,你不能使用 DAO 来创建CHECK约束 :)

于 2008-09-29T13:11:28.523 回答
1

MS Access 还可以将数据从简单的文本文件附加到表中。CSV 值(我只是使用 Replace All 框删除除逗号以外的所有内容)并在 External Data 下选择 Text File。

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
于 2013-05-07T21:33:53.310 回答
0

基于来自@Jonathan 的 VBA 解决方法,并在当前 Access 数据库中执行:

Public Sub InsertMinimalData()
  CurrentDb.Execute "INSERT INTO FinancialYear (FinancialYearID) VALUES ('FY2019/2020');"
  CurrentDb.Execute "INSERT INTO FinancialYear (FinancialYearID) VALUES ('FY2020/2021');"
End Sub
于 2021-01-14T20:56:07.993 回答