--假设id为标识种子
alter table tablename add id1 int
update tablename set id1=id
alter table tablename drop column id
exec sp_rename 'tablename.id1','id'

解决方案 »

  1.   

    不能控制,只能整表重建.企业管理器都是这样做法.例如:
    --有表
    create table tb(a int,b int)--要添加id到a前面,需要用:
    --备份原表数据
    select * into #tb from tb--删除原表
    drop table tb--重建表,添加id标识列
    create table tb(id int identity(1,1),a int,b int)--恢复数据
    insert into tb select * from #tb--删除临时表
    drop table #tb
      

  2.   

    添加一列时如何控制添加的位置?
    如果是新建表好说,按字段的顺序排列就行了
    如果向已有表里加字段,而且还不是加在最后,比较麻烦,建议你到SQL SERVER企业管理器里
    利用表设计功能,选中某一列,右键-》插入列....
      

  3.   

    去标识alter table tablename add id1 intupdate tablename set id1=idalter table tablename drop column idexec sp_rename 'tablename.id1','id'  
     加标识有数据的话
    ALTER TABLE 表 ADD 编号1 bigint identity(1,1) not null
    go
    SET IDENTITY_INSERT 表 ON
    go
    update 表 set 编号1=编号
    go
    SET IDENTITY_INSERT 表 OFF
    go
    ALTER TABLE 表 DROP COLUMN 编号 
    go
    exec sp_rename '表.编号1','编号'
    go
      

  4.   

    如果向已有表里加字段,而且还不是加在最后,就是这样的,有什么办法吗?
    老大,如果用SQL SERVER企业管理器,我还用问吗?
    是要用SQL语句实现啊?
      

  5.   

    在任何位置插入列:
    create proc addcolumn
    @tablename varchar(30),  --表名
    @colname varchar(30),    --要加的列名
    @coltype varchar(100),   --要加的列类型
    @colid int               --加到第几列
    asdeclare @colid_max int    
    declare @sql varchar(1000) --动态sql语句
    --------------------------------------------------
    if not exists(select  1 from sysobjects 
                  where name = @tablename and xtype = 'u')
      begin
      raiserror 20001 '没有这个表'
      return -1
      end
    --------------------------------------------------
    if exists(select 1 from syscolumns
              where id = object_id(@tablename) and name = @colname)
      begin
      raiserror 20002 '这个表已经有这个列了!'
      return -1
      end
    --------------------------------------------------
    --保证该表的colid是连续的
    select @colid_max = max(colid) from syscolumns where id=object_id(@tablename)if @colid > @colid_max or @colid < 1 
       set @colid = @colid + 1
    --------------------------------------------------
    set @sql = 'alter table '+@tablename+' add '+@colname+' '+@coltype 
    exec(@sql)select @colid_max = colid 
    from syscolumns where id = object_id(@tablename) and name = @colname
    if @@rowcount <> 1
      begin
      raiserror 20003 '加一个新列不成功,请检查你的列类型是否正确'
      return -1
      end
    --------------------------------------------------
    --打开修改系统表的开关
    EXEC sp_configure 'allow updates',1  RECONFIGURE WITH OVERRIDE--将新列列号暂置为-1
    set @sql = 'update syscolumns
                set colid = -1
                where id = object_id('''+@tablename+''') 
                      and colid = '+cast(@colid_max as varchar(10))
    exec(@sql)--将其他列的列号加1
    set @sql = 'update syscolumns
                set colid = colid + 1
                where id = object_id('''+@tablename+''') 
                      and colid >= '+cast(@colid as varchar(10))
    exec(@sql)--将新列列号复位
    set @sql = 'update syscolumns
                set colid = '+cast(@colid as varchar(10))+'
                where id = object_id('''+@tablename+''') 
                      and name = '''+@colname +''''
    exec(@sql)
    --------------------------------------------------
    --关闭修改系统表的开关
    EXEC sp_configure 'allow updates',0  RECONFIGURE WITH OVERRIDE
    go
    调用方法:
    exec addcolumn '表名','新列名','新列类型',加到第几个位置
    如:
    exec addcolumn 'a02','id2','char(10)',2
    表示将id2这个列加到表test的第二个位置,类型是char(10)。
    select * from a02
      

  6.   

    直接用alter table tablename add column name .... 只能添加到表的最后一个字段,
    或先保存表中的数据,删除表,新建表,再将数据导回来!
    这种方法,有个缺点就是,当要修改的表有外键约束就比较麻烦.
    还要先删除外键约束!
      

  7.   

    aierong:
    还需要做什么设置吗?你的存储过程我执行后表就打不开了啊?
    错误:
    加载到内存的表具有一种无法识别的用户定义类型
      

  8.   

    就是按照:
    exec addcolumn '表名','新列名','新列类型',加到第几个位置
    我的是:
    exec addcolumn 'yao','id2','int',2再执行 select * from yao 错误:
    SqlDumpExecptionHandler:进程55发生了严重异常c0000005 EXCEPTION_ACCESS_VIOLATION.
      

  9.   

    aierong(皑婀瑢-数据库XML.NET联盟会局长) 的方法使用不当就很危险!
    ----------
    新增列的位置,不能是任何位置!
    当表中的列上有pk,fk等其他完整性约束时时,只修改 syscolumns 表
    而不修改 sysindexes 和 sysindexkeys 等其他系统表!
    后果很糟糕!