对动态添加列的表的操作 ( 积分: 100 )

  • 主题发起人 主题发起人 cresthong
  • 开始时间 开始时间
C

cresthong

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个数据表talbe1
ID 项目 类型 长度
1 计量单位 字符 20
2 数量 数字 4
. .... .... .
. .... .... .
起始时table2为
ID 书名
然后
table2将根据table1的内容动态的添加列
ID 书名 计量单位(varchar(20)) 数量(int(4))..........

table2 的列数是不确定的

怎样添加列到table2中
并对table2进行插入,修改,删除等操作
 
你可以用SQL语句动态修改table2进行添加列,
例如:alter table table2 add 计量单位(varchar(20)) ,数量(int(4))..........
插入数据:insert into table2(计量单位,数量,...) select 计量单位,数量,...from table1
如果检索到不用的列,可删除,
如:alter table table2 drop column 计量单位,数量
 
问题是table1中的内容不是事先确定的,是根据需要添加table1中的内容。
 
那你在哪里触发来执行刷新table1记录的,就在哪里写一个存储过程,把上面我说的相关SQL语句写进去,就可以了,当你刷新table1记录的时候,就动态改变table2的列和记录呀,
 
然后,在你刷新table1事件里,调用存储过程就可以,或者不用写存储过程,就用代码实现也是一样的效果,只是稍微麻烦一点!
 
insert into table2(计量单位,数量,...) ...
计量单位,数量 这些字段名怎么写啊,这些都是不确定的
 
这些字段名,可以根据table1里的来呀,你要加什么字段,可以从table1知道吧,要不然,不能从table1得出要加什么字段,那不可能修改table2的列和记录的
 
小弟,刚学。那insert要怎么写,我只会写确定的
 
我想问你,table1和table2是不是列都一样的,还是怎么样的,你具体想要什么效果?说清楚点
 
table1和table2的例当然不一样
table2中的列可以根据需要增加,而这些的列的名称,数据类型,长度 是在table1中的
用户可以往table1中添加,修改,删除记录,相应的table2中的列可以增加,改变,删除
不知道这样是不是清楚了一点?
 
你觉得这样看行不行,再用一个表当创建了table2时,把table1里的记录备份一下,也就是说,这个表专用来备份table1记录作了哪些修改,如果当table1记录有新增,或者修改时,就和这个表里的记录比较一下,如果发现有不同了,就更新table2里的列和结构,
假设:
table1
//-------------------------------
FieldName FieldType Length
ID号 varchar 15
UnitName varchar 10
Qty float 8
----------------------------------
//table2 表结构
ID号 UnitName Qty
01-01 KG 1.85
01-02 KG 2.47
. . .
. . .
. . .
01-15 KG 100

//------另加一个表和table1记录一样,每次新增也要往这个表加记录,但不能修改这个表记录
简写代码如下:要放在某个事件执行:
//---------
//---ttempa 备份表
var
FieldList,OldFieldList:String ;
Str:String ;

Query1.Close
Query1.SQL.Clear;
Query1.SQL.Add('Select * from table1 where FieldName not in (select FieldName from ttempa)');
Query1.Open

//==========找出列来,把table2新增列
FieldList:=''
if not Query1.IsEmpty then
begin
Query1.First ;
while not Query1.Eof then
begin
if (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'CHAR')
OR (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'VARCHAR')
OR (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'TEXT') then
begin
FieldList:= FieldList +','+Query1.FieldByName('FieldName').AsString
+Query1.FieldByName('FieldType').AsString+'('+Query1.FieldByName('Length').AsString+')') ;
end
else if (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'BIT')
OR(UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'INT')
OR(UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'FLOAT')
OR(UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'DATETIME')then
begin
FieldList:= FieldList +','+Query1.FieldByName('FieldName').AsString
+Query1.FieldByName('FieldType').AsString) ;

end ;

Query1.Next ;
end ;
FieldList:=Copy(FieldList,2,length(FieldList));
Str:= 'Alter table2 Add '+FieldList ;//新增列

QueryUpdate.Close ;
QueryUpdate.SQL.Clear ;
Str:= 'Alter table2 Add '+FieldList ;
QueryUpdate.SQL.Add(Str);
QueryUpdate.ExecSQL;

end
else
begin
//======表明table1没有加记录,进行比较,如果不同,即要修改table2的列
QueryOld.Close
QueryOld.SQL.Clear;
QueryOld.SQL.Add('select FieldName from ttempa');
QueryOld.Open

OldFieldList:='' ;
Query1.First ;
while not Query1.Eof then
begin
if (Query1.FieldByName('FieldByName').AsString<> QueryOld.FieldByName('FieldByName').AsString)
AND (Query1.FieldByName('FieldType').AsString<> QueryOld.FieldByName('FieldType').AsString)
AND (Query1.FieldByName('Length').AsString<> QueryOld.FieldByName('Length').AsString)then
begin
if (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'CHAR')
OR (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'VARCHAR')
OR (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'TEXT') then
begin
FieldList:= FieldList +','+Query1.FieldByName('FieldName').AsString
+Query1.FieldByName('FieldType').AsString+'('+Query1.FieldByName('Length').AsString+')') ;
end
else if (UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'BIT')
OR(UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'INT')
OR(UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'FLOAT')
OR(UPPERCASE(Trim(Query1.FieldByName('FieldType').AsString))<>'DATETIME')then
begin
FieldList:= FieldList +','+Query1.FieldByName('FieldName').AsString
+Query1.FieldByName('FieldType').AsString) ;

end ;
//这个用来当修改Table2 列时,把原有的列删除
OldFieldList:=OldFieldList+','+Query1.FieldByName('FieldName').AsString;
end ;
Query1.Next ;
end ;

FieldList:=Copy(FieldList,2,length(FieldList));

//=========先删除要修改table2的列
QueryUpdate.Close ;
QueryUpdate.SQL.Clear ;
Str:= 'Alter table2 Drop Column '+OldFieldList ;
QueryUpdate.SQL.Add(Str);
QueryUpdate.ExecSQL;

//=========同时也把备份表中记录再重新从table1中导入一次,或者只把不同的记录导入就可以
//=====这里不介绍了

//=========在Tabel2加入新列
Str:= 'Alter table2 Add '+FieldList ;//加入新列

QueryUpdate.Close ;
QueryUpdate.SQL.Clear ;
Str:= 'Alter table2 Add '+FieldList ;
QueryUpdate.SQL.Add(Str);
QueryUpdate.ExecSQL;
end ;


//=====当修改table2列或者新列之后,再把记录从别的相关表导入或者更新就可以,这里不作介绍了
上述代码,你可以参考一下
 
谢谢gxf1681!
用备份表是不是有点麻烦?我打算这样做:
用SQL语句来修改table2中的列
declare @sql varchar(2000)
set @sql='alter table table2 add '
select @sql=@sql+项目名称+if exists(Select * from dbo.syscolumns Where Name=项目名称 And ID=OBject_ID('教材管理卡片编辑')) ''
else
case
when 项目类型 = '文本型' then ' varchar(' + rtrim(项目长度) + '),'
when 项目类型 = '数字型' then ' int'
end from table1
set @sql=left(@sql,len(@sql))

print @sql
exec(@sql)
以上斜体语句有错
这样做我将会遇到几个问题
1、如何在SQL语句中实现:判别table2中的列是否已经存在
2、如何对table2进行操作,因为列不确定。在insert语句中要写列的字段名,而我不知道table2中有哪些字段名
 
后退
顶部