我正在使用MS Access 2003.我想在MS Access中的“查询”中运行大量插入SQL语句。是否有任何简单(或实际上有任何方式)可以做到这一点?
答案 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)
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窗口,
很无聊。 相反,您可以通过执行以下操作从excel导入行:
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