我现在有两个表,Table1、Table2:
Table1表结构如下:
编号 姓名 性别table2表结构如下:
编号 项目名称 性质
001  年龄   1
002  生日   1
003  性别   0 问题如下:
我现要把table2项目名称字段下的记录把它作为字段名增加到Table1里,
(Tabel2表:性质=1为要增加的,性质=0为不要增加的)
即修改后的Table1表结构如下:
编号 姓名 性别 年龄 生日我现在的作法是:
Update table set //但这只能更改表里的记录,不能更改表结构。
怎样按上面讲的更改表结构,请高手指点。

解决方案 »

  1.   

    alter table table1
    add 年龄 int,生日 datetime
    go
      

  2.   

    TO:chinaandys(风流泪,雨含笑) 
      with Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('alter table1 table2 add 年龄 int,生日 datetime');
        Open;
    //    ExecSQL;
       end;
    运行时就出错,提示如下:
    DBISAM Engine Error # 11949 SQL error - 'TABLE keyword expected, instead found 'table1''
      

  3.   

    TO:chinaandys(风流泪,雨含笑)
    你没有实现我要的要求
    我现要把table2项目名称字段下的记录把它作为字段名增加到Table1里,
    (Tabel2表:性质=1为要增加的,性质=0为不要增加的)
    即修改后的Table1表结构如下:
    编号 姓名 性别 年龄 生日
      

  4.   

    with Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('alter table table1 add 年龄 int,生日 datetime');
        ExecSQL;
       end;
    不能用open,而且你的sql语句有问题,增加字段的格式
    为:alter table tablename add 字段1 数据类型1,字段2 数据类型2.....
      

  5.   

    TO:drift1981(励精图治)
    运行时就出错,提示如下:
    DBISAM Engine Error # 11949 SQL error - 'End of ALTER TABLE statement expected, instead found '生日''
    请看清楚以下问题:
    我现在要的是把table2项目名称字段下的记录把它作为字段名增加到Table1里,
    (Tabel2表:性质=1为要增加的,性质=0为不要增加的)
    即修改后的Table1表结构如下:
    编号 姓名 性别 年龄 生日
      

  6.   

    你的目的是不是在table1增加两个字段,一个是年龄int型,一个是生日 datetime型?如果是这样的话,上面的代码在我这里试验没什么问题!
      

  7.   

    修改你的Table2表結構,應該再加多一個欄位用來存放,字段的類型,形式如
    varchar(20)或 int 或datetime 或 numeric(18,2)
    with query1 do
    begin
    close;
    sql.clear;
    sql.add('declare @fieldname varchar(50), @fieldtype varchar(50), @useble bit');
    sql.add('declare addfield cursor for select fieldname, fieldtype,  useble from table2');
    sql.add('open addfield');
    sql.add('fetch next from addfield into @fieldname, @fieldtype, @useble');
    sql.add('while @@fetch_status=0');
    sql.add('begin');
    sql.add('if @useble=1 ');
    sql.add('exec (''alter table table1 add ''+@fieldname+'' ''+@fieldtype+'' '')');
    sql.add('fetch next from addfield into @fieldname, @fieldtype, @useble');
    sql.add('end');
    sql.add('close addfield');
    sql.add('deallocate addfield');
    sql.exesql;
      

  8.   

    TO:Reaky(Reaky) 
    我的数据库为DBISAM4.05好象不支持那些语法呀,还有没有其它的办法。
      

  9.   

    可能大家误会我的意思了,我在说清楚点,如下:
    我现在的意思是通过程序方式根据table2表里的项目名称字段下的记录作为字段名动态往Table1表中添加。
    望高手指点,谢谢!
      

  10.   

    先取出table2表里的项目名称字段下的记录 
     while not adoquery2.eof then
      with Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('alter table table1 add //adoquery2.fieldbyname().as*  int);
        ExecSQL;
       end;
    说说你要实现什么 我觉得你的设计思路有点问题
      

  11.   

    取出项目名称字段下的记录且性质为1
    然后按照楼上的alter table一项一项的添加
      

  12.   

    TO:Changefish(问题总会解决的)
    我现在是要实现动态修改表Table1
    根据table2表里的项目名称字段下的记录作为字段名动态往Table1表中添加。
      

  13.   

    这是我自己写的代码,运行出错请高手指点
    var
      name:string;
    begin  with query2 do
      begin
        close;
        SQL.Clear;
        sql.Add('select 编号,项目名称,字段类型,性质 from table2');
        ExecSQL;
        First;
      end;   while not Query2.eof do
        begin
          with query1 do
          begin
            name:=query2.ParamByName('项目名称').asstring;  //Error
            sql.add('alter table table1 add '+ name +' string');  //Error
            execsql;
          end;
          query2.next;
        end;
    end;
      

  14.   

    这个难吗,请高手指点一下。
    var
      name:string;
    begin  with query2 do
      begin
        close;
        SQL.Clear;
        sql.Add('select 编号,项目名称,字段类型,性质 from table2');
        ExecSQL;
        First;
      end;   while not Query2.eof do
        begin
          with query1 do
          begin
            name:=query2.ParamByName('项目名称').asstring;  //Error
            sql.add('alter table table1 add '+ name +' string');  //Error
            execsql;
          end;
          query2.next;
        end;
    end;
      

  15.   

    我都不信你这程序能跑起来,你看
      with query2 do
      begin
        close;
        SQL.Clear;
        sql.Add('select 编号,项目名称,字段类型,性质 from table2');
        ExecSQL;                                          《-------------这行
        First;
      end;
    都没有打开数据集,怎么first??用select语句要使用open。你这段程序根本都执行不到你说有错误的地方,我就纳闷,你那错误怎么出来的!
      

  16.   

    把第一个execsql改成open旧解决了。
      

  17.   

    TO:capoatguitar(菠萝蜜汁红塔山),现在错误肯定在第二段的程序中,请我指出错误,谢谢。
    按你说的改了,错误提示如下:
    ''学号'' is not a valid component name.
      

  18.   

    while not Query2.eof do
        begin
          with query1 do
          begin
            name:=query2.ParamByName('项目名称').asstring;  //不知道你'项目名称'这个参数在哪里?是不是应该改成fieldbyname
            sql.add('alter table table1 add '+ name +' string');  //Error
            execsql;
          end;
          query2.next;
        end;
    end;
      

  19.   

    TO:drift1981(励精图治)
    你说的那个我也试过不行呀,'项目名称'是table2表里的字段名,
    我现在要把根据table2表里的项目名称字段下的记录作为字段名动态往Table1表中添加。
    错误提示如下:
    ''学号'' is not a valid component name.
      

  20.   

    -------------------------------------------------------------
    --我现在有两个表,Table1、Table2:
    --Table1表结构如下:
    --编号 姓名 性别
    --
    --table2表结构如下:
    --编号 项目名称 性质
    --001  年龄   1
    --002  生日   1
    --003  性别   0 --问题如下:
    --我现要把table2项目名称字段下的记录把它作为字段名增加到Table1里,
    --(Tabel2表:性质=1为要增加的,性质=0为不要增加的)--即修改后的Table1表结构如下:
    --编号 姓名 性别 年龄 生日
    --探测表1 并删除
    if exists (select 1
                from  sysobjects
                where  id = object_id('tbl1')
                and   type = 'U')
       drop table tbl1
    go--探测表2 并删除
    if exists (select 1
                from  sysobjects
                where  id = object_id('tbl2')
                and   type = 'U')
       drop table tbl2
    go
    --建表1
    create table tbl1
    (
    [编号] char(10),
    [姓名] char(10),
    [性别] char(10)
    )
    贴到查询分析器里 直接执行
      

  21.   

    go--建表2
    create table tbl2
    (
    [编号] char(10),
    [项目名称] char(10),
    [性质] char(10)
    )--插入数据到表2
    insert into tbl2 values('001','年龄','1')
    insert into tbl2 values('002','生日','1')
    insert into tbl2 values('003','性别','0')--输出表1更改前结构
    select * from tbl1--更改表1结构
    declare @sql varchar(8000)
    set @sql = ' '
    select @sql = @sql + 'alter table tbl1 add ['+rtrim(ltrim([项目名称]))+'] char(20)  '
    from (select distinct [项目名称]  from tbl2 where [性质]='1') as a
    exec(@sql)
    go--输出表1更改后结构
    select * from tbl1
      

  22.   

    var
      name:string;
    begin  with query2 do
      begin
        close;
        SQL.Clear;
        sql.Add('select 项目名称 from table2 where 性质=1');
        open;
        First;
      end;   while not Query2.eof do
        begin
          with query1 do
          begin
            close;
            sql.clear;
            name:=query2.fieldyName('项目名称').asstring;  
            sql.add('alter table table1 add '+ name +' nvarchar(10) NUll'); 
            execsql;
          end;
          query2.next;
        end;
    end;
      

  23.   

    TO:guoshaoj(天问)
    我的代码是SQL的语法吧,我的数据库为DBISAM4.05的,好象不支持那些语法呀,能不能改一下。
    TO: capoatguitar(菠萝蜜汁红塔山) 
    你改了之后也不是一样,出现这个错误提示
    ''学号'' is not a valid component name.
      

  24.   

    我把这人源代码上传了,请帮我改改,第一个是控件,第二个是源代码,
    改完后发到我邮箱里,[email protected]
    jnonlie.meibu.com/download/DBISAM.rar
    jnonlie.meibu.com/download/222.rar
      

  25.   

    问题好象出在变量赋值的地方,但不知道怎么改,改了几种写法都不行.我把这个源代码上传了,请帮我改改,第一个是控件,第二个是源代码,
    改完后发到我邮箱里,[email protected]
    jnonlie.meibu.com/download/DBISAM.rar
    jnonlie.meibu.com/download/222.rar