--删除重新建立
alter table tbl drop column 标识列 
alter table tbl add 标识列 int identity(1,1)

解决方案 »

  1.   


    --引用班主邹建:sql server不支持在自增列与非自增列之间进行转换.
    (楼主可以观察一下企业管理器中这种调整的处理, 它也无法用alter 语句直接完成)
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_DropIDENTITY]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_DropIDENTITY]
    GO/*--标识列转换为普通列 采用修改标识列名,然后按新规则重列的方法处理
    只适用于标识列没有与其他对象有关联的表
    转换后,列的相关对象也不会恢复
    有一定的局限性,仅供参考--邹建 2005.05(引用请保留此信息)--*//*--调用示例 EXEC p_DropIDENTITY 'tb'
    --*/
    CREATE PROC p_DropIDENTITY
    @TableName sysname --要处理的表名
    AS
    IF ISNULL(OBJECTPROPERTY(OBJECT_ID(@TableName),N'IsUserTable'),0)=0
    BEGIN
    RAISERROR('"%s" 必须是当前数据库中已经存在的用户表',12,16,@TableName)
    RETURN
    END--标识列转换处理检查
    DECLARE @s nvarchar(1000),@FieldName sysname,@bkFieldName sysname,@sql nvarchar(4000)
    SELECT @FieldName=QUOTENAME(c.name),
    @bkFieldName=CAST(NEWID() as char(36)),
    @s=@FieldName+N' '+QUOTENAME(t.name)
    +CASE WHEN t.name LIKE '%int' THEN N''
    ELSE N'('+CAST(c.prec as varchar)
    +N','+CAST(c.scale as varchar)+N')'
    END
    FROM sysobjects o,syscolumns c,systypes t
    WHERE o.name=@TableName
    AND o.id=c.id
    AND c.xusertype=t.xusertype
    AND c.status=0x80
    IF @@ROWCOUNT=0
    BEGIN
    RAISERROR(N'表 "%s" 中无标识列',1,16,@TableName)
    RETURN
    END--修改标识列名
    SET @sql=QUOTENAME(@TableName)+N'.'+@FieldName
    EXEC sp_rename @sql,@bkFieldName,N'COLUMN'--转换为标识列处理
    SELECT @TableName=QUOTENAME(@TableName),
    @bkFieldName=QUOTENAME(@bkFieldName)
    EXEC('ALTER TABLE '+@TableName+N' ADD '+@s)
    EXEC('UPDATE '+@TableName+N' SET '+@FieldName+N'='+@bkFieldName+N'
    ALTER TABLE '+@TableName+N' DROP COLUMN '+@bkFieldName)
    RAISERROR(N'表 "%s" 中的标识列 "%s" 已经转换为普通列',1,16,@TableName,@FieldName)
    GO 
    ----------------------------------------------------------------/*
    把表 "Tb" 里的字段 "ID" 属性改成 "自动编号""Tb"表里以前有数据,"ID"里是数值型的
    */
    create table Tb(id int)
    go
    insert into Tb(id) values(1)
    insert into Tb(id) values(10)
    insert into Tb(id) values(20)
    insert into Tb(id) values(11)begin transaction--创建临时表
    create table dbo.temp_Tb (id int not null identity (1, 1)) on [primary]
    go
    set identity_insert dbo.temp_Tb on
    go--向临时表中插入数据
    if exists(select * from dbo.Tb)
    exec('insert into dbo.temp_Tb (id) select id from dbo.Tb tablockx')
    go
    set identity_insert dbo.temp_Tb off
    go--删除原表
    drop table dbo.Tb
    go--重命名临时表
    execute sp_rename 'temp_Tb', 'Tb', 'object'
    go
    commitdrop table Tb
    go
    虽然这样处理可以,但是会丢失关系、触发器等等相关对象。
    ----------------------------------------------------------------可以考虑把原来的ID列Drop掉,用SQL语句增加ID(标识列)