有什么方法可以在ms-access查询中创建多个insert语句?

时间:2020-03-05 18:53:21  来源:igfitidea点击:

我正在使用MS Access2003. 我想在MS Access中的"查询"中运行大量插入SQL语句。有没有简单(或者确实有任何方法)做到这一点?

解决方案

回答

Access中没有查询是单个SQL语句。无法在一个查询对象中创建一批多个语句。
我们可以创建多个查询对象,然后从宏/模块中运行它们。

回答

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

回答

是的,没有。

我们不能:

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),以愚弄访问权限以允许联合(联合中必须至少包含一行),并且我们需要" top 1"来确保不没有重复的表多于一行

但是话又说回来,做三个单独的插入语句可能会更容易,
尤其是如果我们已经在循环中构建东西(当然,插入的成本要比编写代码的时间高)。

回答

我认为不建议像Jonathan那样建议一个特定的数据接口,而我们还没有弄清代码将在其中运行的上下文。

如果数据存储是Jet数据库,则除非我们从脚本平台(首选)运行代码,否则使用任何形式的ADO几乎没有任何意义。如果我们使用的是Access,则绝对不是这种情况,并且DAO是首选接口。

回答

@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时注释:"在我的头上,执行此操作的代码应类似于"毕竟,我们不能使用DAO创建CHECK约束:)