我想把源表的数据导到一张新表,先select * into 到新表,
在给ID字段修改为自增,因为原有ID列数据是不能丢的,sqlserver企业管理器界面里数据导完后,
可以修改,但脚本好像不能直接
“alter table table_1 alter column id int identity(1,1)”,请高手指点,因为我有一批这样的表,
手动点界面要慢死的!

解决方案 »

  1.   

    我理解的你的问题是你导入到新表的时候要保留原表的ID列,还要设置一个自增列用来存放导入数据排列。
    可以在新表中加一个IDD列
    alter table table_1 alter column id int identity(1,1)这个我就不懂了。既然你之前的列如果是自增的列,为何还有修改呢,如果不是自增的,你修改之后如何保存之前的值呢
      

  2.   

    原表的ID是自增的,然后我通过select * into 目标表后,id只为int型,现在想修改为自增的,脚本
    “alter table table_1 alter column id int identity(1,1)”这样写不对,应该这么改呢?
      

  3.   

    你的意思是原表的ID自增规则再SELECT * INTO 新表后ID不在自增了?
      

  4.   

    ID列有数据的话,是不能直接设置自增的。只能删除ID列,在重新ADD一列自增列ID。
      

  5.   


    --创建测试数据
    if OBJECT_ID('T_a') is not null  drop table T_a
    create table T_a(
    id int identity(1,2),--每次自增2
    name nvarchar(20))insert  T_a(name)
    SELECT 'AAA' union all
    SELECT 'BBB' union all
    SELECT 'CCC' union all
    SELECT 'DDD' union all
    SELECT 'EEE' union all
    SELECT 'FFF'  /*------------------------------一个案例便于理解(下面封装到存储过程里面了)--------------------------------
    --创建新表(T_b)复制结构复制旧表 T_a
    if OBJECT_ID('T_b') is not null drop table T_b
    --创建新表(字段结构复制于旧表)
    select * into T_b from T_a where 1<>1
    --删除标示 id
    alter table T_b drop column id
    --新增一列标示 id1
    alter table T_b add id1 int identity(1,1)
    --又新增(还原)旧表标示列 id
    alter table T_b add id int
    --得到旧表所有列
    declare @columnname nvarchar(max)
    select  @columnname=','+[name]+isnull(@columnname,'') from syscolumns where id=object_id('T_a')
    set @columnname=right(@columnname,len(@columnname)-1)
    --新表从旧表复制数据
    declare @sql nvarchar(500)
    set @sql='INSERT INTO T_b('+@columnname+')select '+@columnname+' from T_a'
    exec (@sql)
    --查询新表数据
    select * from T_b
    ------------------------------------------------------------------------------------------*/create procedure CopyTable(
    @OldtableName nvarchar(50),--旧表名
    @NewtableName nvarchar(50),--新表名
    @Oldid nvarchar(50),--旧表标示
    @Newid nvarchar(50)--新表标示
    )
    as
    begin
    declare @strsql varchar(max)
    --创建新表(T_b)复制结构复制旧表 T_a
    set @strsql='if OBJECT_ID('''+@NewtableName+''') is not null drop table '+@NewtableName
    --创建新表(字段结构复制于旧表)
    set @strsql=@strsql+' select * into '+@NewtableName+' from '+@OldtableName+' where 1<>1'
    --删除标示 id
    set @strsql=@strsql+' alter table '+@NewtableName+' drop column '+@Oldid
    --新增一列标示 id1
    set @strsql=@strsql+' alter table '+@NewtableName+' add '+@Newid+' int identity(1,1) '
    --又新增(还原)旧表标示列 id
    set @strsql=@strsql+' alter table '+@NewtableName+' add '+@Oldid+' int'
    --得到旧表所有列
    set @strsql=@strsql+' declare @columnname nvarchar(max)'
    set @strsql=@strsql+' select  @columnname='',''+[name]+isnull(@columnname,'''') from syscolumns where id=object_id('''+@OldtableName+''')
    set @columnname=right(@columnname,len(@columnname)-1)'
    --新表从旧表复制数据
    set @strsql=@strsql+' declare @sql nvarchar(500) '
    set @strsql=@strsql+' set @sql=''INSERT INTO '+@NewtableName+'(''+@columnname+'')select ''+@columnname+'' from '+@OldtableName+''''
    set @strsql=@strsql+' exec (@sql) '
    --查询新表数据
    set @strsql=@strsql+'select * from '+@NewtableName
    exec(@strsql)
    end--调用
    exec CopyTable 'T_a','T_c','id','id3'
    /*
    name                 id3         id
    -------------------- ----------- -----------
    AAA                  1           1
    BBB                  2           3
    CCC                  3           5
    DDD                  4           7
    EEE                  5           9
    FFF                  6           11(6 行受影响)
    */