有什么方法可以在ms-access查询中创建多个insert语句?
我正在使用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
约束:)