有没有办法在ms访问查询中创build多个插入语句?
我正在使用MS Access 2003.我想在MS Access中所谓的“查询”中运行大量的插入SQL语句。 有没有什么容易的(或者确实有办法)做到这一点?
是和不是。
你不能这样做:
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)
注意:我还必须包含某种forms的虚拟表格(例如,onerow),以欺骗访问允许工会(它必须至less有一排),你需要“顶部1”,以确保你不要对于不止一行的表格可以重复使用
但是再说一次,做三个单独的插入语句可能会更容易一些,特别是如果你已经在循环中build立了东西(除非插入的代价当然大于你编写代码的时间) 。
就个人而言,我会创build一个VBA子程序来做到这一点,并使用某种forms的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
我认为,像Jonathan那样提出一个特定的数据接口是不明智的,因为当时你还没有弄清代码运行的上下文。
如果数据存储是Jet数据库,那么使用任何forms的ADO都是没有意义的,除非您从脚本平台运行代码,而这是首选。 如果你在Access中,这肯定不是这种情况,DAO是首选的接口。
否 – Access中的查询是单个SQL语句。 在一个查询对象内没有办法创build一批多个语句。 您可以创build多个查询对象并从macros/模块运行它们。
@Rik加纳:不知道你的意思是“批”,但
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 语句 ,但是实际上每次只会插入一行(而不是一次),而是在同一个事务中:可以通过添加相关的约束来testing
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有强烈的个人偏好,但是对于select另一种数据访问技术(在这种情况下为ADO)的人来说,请不要太难,特别是对于一个香草INSERT
, ,“closures我的头顶部,代码做这个应该看起来像…”毕竟,你不能使用DAO创buildCHECK
约束:)
MS Access不允许从同一个SQL窗口多次插入。 如果你想要插入 ,比如说10行 ,比如电影(mid,mname,mdirector,….) ,你需要打开sql窗口,
- 键入第一个stmt,执行第一个stmt,删除第一个stmt
- input第二个标记,执行第二个标记,删除第二个标记
- input第三条,执行第三条,删除第三条……
很无聊。 相反,您可以通过执行从Excel导入行:
- 右键单击已经创build的表名
- 从Excel导入(导入对话框打开)
- 浏览到包含要在表中导入的logging的excel文件
- 点击“添加logging到表格的副本”
- select所需的表(在这个例子中的电影)
- 点击“确定”
- select包含电子表格中的数据的工作表
- 点击完成
excel中的整个数据集已经加载到表格“MOVIE”
MS Access也可以将数据附加到一个简单的文本文件的表中。 CSV的值(我只是使用“全部replace”框来删除所有逗号),在“外部数据”下select“文本文件”。
From this: INSERT INTO CLASS VALUES('10012','ACCT-211','1','MWF 8:00-8:50 am','BUS311','105'); INSERT INTO CLASS VALUES('10013','ACCT-211','2','MWF 9:00-9:50 am','BUS200','105'); INSERT INTO CLASS VALUES('10014','ACCT-211','3','TTh 2:30-3:45 pm','BUS252','342'); To this: 10012,ACCT-211,1,MWF 8:00-8:50 am,BUS311,105 10013,ACCT-211,2,MWF 9:00-9:50 am,BUS200,105 10014,ACCT-211,3,TTh 2:30-3:45 pm,BUS252,342