有没有办法在ms-access查询中创建多个insert语句?

时间:2008-09-15 12:49:56

标签: ms-access

我正在使用MS Access 2003.我想在MS Access中的“查询”中运行大量插入SQL语句。是否有任何简单(或实际上有任何方式)可以做到这一点?

7 个答案:

答案 0 :(得分:34)

是和否。

你做不到:

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语句,它由许多Selects联合组成,带有硬编码结果。

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”来确保不会为具有多行的表格重复

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

答案 1 :(得分:3)

就个人而言,我会创建一个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

答案 2 :(得分:2)

我认为建议一个特定的数据接口是不可取的,正如Jonathan所做的那样,当你还没有明确代码将要运行的上下文时。

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

答案 3 :(得分:1)

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

答案 4 :(得分: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约束:)

答案 5 :(得分:1)

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

  1. 键入第一个stmt,执行第一个stmt,删除第一个stmt
  2. 键入第二个stmt,执行第二个stmt,删除第二个stmt
  3. 键入第3个stmt,执行第3个stmt,删除第3个stmt ......
  4. 很无聊。 相反,您可以通过执行以下操作从excel导入行:

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

答案 6 :(得分:1)

MS Access还可以从简单的文本文件将数据附加到表中。 CSV值(我只使用“全部替换”框删除除逗号之外的所有内容)并在“外部数据”下选择“文本文件”。

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