怎样方便快速复制记录? (100分)

  • 主题发起人 主题发起人 fsivanl
  • 开始时间 开始时间
F

fsivanl

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一数据表的字段较多,50多个(或者不定),有一个自动编号的ID字段,我想复制一
条记录到同一份表内,用SQL语句或简单的控件怎样实现?(除了ID字段,我不想直接将所
有字段都输入到SQL语句中,因为字段名会变)。
 
INSERT INTO table (SELECT * FROM table1 WHERE id= );
是不是把记录复制到另一个结构相同的表中.
 
是复制到同一份表内[:(]
 
Select * into #T From Table Where ID=?
Update #T Set ID=ID+1
Insert Table Select * from #T
 
To tyzhang:
ID字段是自动编号,“Insert Table Select * from #T”这一句是不是非法?
 
Select * into #T From Table Where ID=?
Update #T Set ID=ID+1
Insert Table Select * from #T

这样写是正确的,但别忘了释放临时表! 不然会有错误!
 
试试这样:
Select * into #T1 From Table Where ID=?
Alert Table #T1 Drop Column ID
Select * Into #T2 From #T1
Insert Table Select * from #T2
 
我只知道
不要太多字段
另外太多记录也不好
把它分开
 
我用的是Access数据库,1022977"Alert table" 非法无效
 
你可以参考一下我这段代码:
我的表是jrq_personcode ,字段 person_code 相当你的ID,我是截取了时间来表示的!
----------
procedure TForm1.BitBtn1Click(Sender: TObject);
var str:string;
var Year,Month,Day,Hour, Min, Sec, MSec :word; yue,tian,shi,fen,miao:string;
begin
DecodeDate(date, Year, Month, Day);
DecodeTime(time, Hour, Min, Sec, MSec);
if Month<=9 then
yue:='0'+inttostr(Month) else yue:=inttostr(Month);
if Day<=9 then
tian:='0'+inttostr(Day) else tian:=inttostr(Day);
if Hour<=9 then
shi:='0'+inttostr(Hour) else shi:=inttostr(Hour);
if Min<=9 then
fen:='0'+inttostr(Min) else fen:=inttostr(Min);
if Sec<=9 then
miao:='0'+inttostr(Sec) else miao:=inttostr(Sec);

str:=' Select * into #Table From jrq_personcode Where person_code='+Edit3.Text //原来的ID
+' Update #Table Set person_code='+inttostr(Year)+yue+tian+shi+fen+miao //更新后的ID
+' Insert jrq_personcode Select * from #Table' //保存
+' drop table #Table'; /////////删除临时表 ,这句千万别忘了,不然会导致异常
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.ExecSQL;

str:='select * from jrq_personcode';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.Open;
end;
 
太简单了。
//记录复制
procedure AppendCurrent(Dataset:TDataset;AFldIndex:integer=0);
Var
aField : Variant ;
i : Integer ;
lnFldCnt:integer;
begin
with DataSet do
begin
lnFldCnt := Fieldcount-AFldIndex-1;
aField := VarArrayCreate([0,lnFldCnt],VarVariant);
For i := 0 to lnFldCnt Do
aField := Fields[AFldIndex+i].Value;
insert;
if not (state in [dsInsert,dsEdit]) then
begin
Last;
Edit;
end;
For i := 0 to lnFldCnt Do
Fields[AFldIndex+i].Value := aField ;
end;
aField := Unassigned;
end;
 
Alert Table XXX Drop XXXX 是标准的SQL语句啊~ 在ACCESS 中应该可以啊!

把 TYZhang 大侠的这句
》》》 Alert Table #T1 Drop Column ID
中 Column 去掉 再试试

一般用这种形式的试试 : Alert Table XXX(表名) Drop XXXX(字段名) CASCADE

不过临时表太多了不太好吧~
 
楼上的没有用SQL语句 没有用过 学习
且去试试! thx
 
SQL语句无法实现,可以直接用ClientDataSet
TempDataSet->Fields->Fields->Assign(ClientDataSet1->Fields->Fields)
付值i从1开始就可跳过ID列
 
我觉得SQL好象比较难实现,最终采用了marknew 的方法并加了一个判断(比较直观),
多谢各位仁兄![^]
 
多人接受答案了。
 
后退
顶部