INSERT INTO A SELECT * FROM B 出错?!是help上的例子!(30分)

  • 主题发起人 主题发起人 Kevin
  • 开始时间 开始时间
K

Kevin

Unregistered / Unconfirmed
GUEST, unregistred user!
有无更好的整库复制数据的方法?
 
目标表和源表最好写全对应的字段名,字段顺序要一致
最好把你的SQL 语句和 使用的数据库类型写上
还可以使用TBATCHMOVE来完成,操作也很简单
 
两库字段可能不一样,除了用batmove,直接复制文件不是更简单(库类型有关)
 
直接文件copy很麻烦(特别是有索引的dbf或db文件), 索引文件的文件名保存在dbf或db的文件头中
直接复制打开会出现索引错. 只有在复制时程序改变dbf或db的文件头(你对dbf的文件头熟悉吗?)
 
试试这样:
INSERT INTO A from SELECT * FROM B
 
Delphi对SQL的支持到底怎么样?象此例似乎就是不支持这种写法。
后来还是用BatchMove.
 
Kevin:
请您决定继续讨论或结束问题!
 
在SQL Server下,可以用
select * into A from b
 
对不起,刚才睡眼朦胧,错了!是建立新表,不是insert,就算没说.
 
使用select into 方法复制出来的表是临时表。在以后的使用中和一般的表会有不同。所以建议还是不要用这种方法。
另外,如果你用的是sql server,使用select into 时,需要在database的opptions里将第一个选项:select into/bulk copy选中。
 
关键问题的所在: INSERT INTO A SELECT * FROM B 能否
被执行, 实际上跟数据库有关系, 和Delphi没什么关系,
有些数据库的Sql语法并不支持INSERT INTO A SELECT 。。。。的
这种结构, 所有的Sql语句的实际用法都和数据库有关, 和Delphi的
关系却不大 。
 
insert into a (field1, field2, field3 ...) values
(select field4,field5,field6... from b)
a.field1=>b.field4 and a.field2=>b.field5
if b.field4 not equal to a.field1 then
must convert to competible
data field.
 
您的数据库支持逻辑日志吗? 可能B表里的内容太多, 导致日志写满, 事务无法完成.
或者SQL 语法错? 架个括号试试看
insert into A (select * from B);
您应当把数据库管理系统类型写清楚, 以及Server 返回的详细的错误信息.
SQL方言还是很多的.
 
用TBATCHMOVE已经OK了.
 
insert into a select * from b完全可行(至少local sql支持), 不过支持是有限制的,
如果没有字段名列表(如本例), 两表的字段类型和顺序要完全相同.
 
对于SQLSERVER:
1:insert into a select * from b完全可行
2:在database的opptions里选项:select into/bulk copy选中
3:我的程序就是这样作的
 
要注意你用的是什么数据库,有些本地数据库不支持这个语句。
 
多人接受答案了。
 

Similar threads

后退
顶部