--如果要用脚本,则要删除主键/外键约束alter table ArchiveDoc add id_bak bigint NULL 
goupdate ArchiveDoc set id_bak=DM1_ArchiveDocID
go--删除主键约束
alter table ArchiveDoc drop constraint PK_ArchiveDocTable
go--删除外键约束
alter table ArchiveDocApprove drop constraint FK_ArchiveDocApprove_ArchiveDoc
alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc1
alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc
goalter table ArchiveDoc drop column DM1_ArchiveDocID
goexec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
go

解决方案 »

  1.   

    谢谢 zjcxc(邹建) 老兄,因为这个东西要得很急,所以,我也不想费时间想了。
    我把ArchiveDoc 的脚本弄出来
    CREATE TABLE [dbo].[ArchiveDoc] (
    [DM1_ArchiveDocID] [bigint] IDENTITY (1, 1) NOT NULL ,
    [DM1_ArchiveDocName] [varchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [DM1_StatusID] [int] NOT NULL 
    ) ON [PRIMARY]
    GOALTER TABLE [dbo].[ArchiveDoc] WITH NOCHECK ADD 
    CONSTRAINT [PK_ArchiveDocTable] PRIMARY KEY  CLUSTERED 
    (
    [DM1_ArchiveDocID]
    )  ON [PRIMARY] 
    GOALTER TABLE [dbo].[ArchiveDoc] ADD 
    CONSTRAINT [FK_ArchiveDoc_ArchiveDocStatus] FOREIGN KEY 
    (
    [DM1_StatusID]
    ) REFERENCES [dbo].[ArchiveDocStatus] (
    [DM3_StatusID]
    )
    GO然后就是其他3张表与DM1_ArchiveDocID 的关系。
    老兄给的脚本运行错误是:服务器: 消息 3725,级别 16,状态 1,行 3
    约束 'PK_ArchiveDocTable' 正由表 'ArchiveDocApprove' 的外键约束 'FK_ArchiveDocApprove_ArchiveDoc' 引用。
    服务器: 消息 3727,级别 16,状态 1,行 3
    未能除去约束。请参阅前面的错误信息。
    服务器: 消息 3733,级别 16,状态 2,行 5
    约束 'FK_ArchiveDocAttribute_ArchiveDoc' 不属于表 'ArchiveDocAttribute'。
    服务器: 消息 3727,级别 16,状态 1,行 5
    未能除去约束。请参阅前面的错误信息。
    服务器: 消息 5074,级别 16,状态 8,行 2
    对象 'PK_ArchiveDocTable' 依赖于 列 'DM1_ArchiveDocID'。
    服务器: 消息 5074,级别 16,状态 1,行 2
    对象 'FK_ArchiveDocAttribute_ArchiveDoc' 依赖于 列 'DM1_ArchiveDocID'。
    服务器: 消息 4922,级别 16,状态 1,行 2
    ALTER TABLE DROP COLUMN DM1_ArchiveDocID 失败,因为有一个或多个对象访问此列。
    服务器: 消息 15335,级别 11,状态 1,过程 sp_rename,行 342
    错误: @newname 值 'DM1_ArchiveDocID' 已用作 COLUMN 名称,该值将导致重复,而这是不允许的。希望zjcxc(邹建)老兄帮忙,小弟十分感谢!!
      

  2.   

    --应该换顺序,先删除外键,再删除主键alter table ArchiveDoc add id_bak bigint NULL 
    goupdate ArchiveDoc set id_bak=DM1_ArchiveDocID
    go
    --删除外键约束
    alter table ArchiveDocApprove drop constraint FK_ArchiveDocApprove_ArchiveDoc
    alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc1
    alter table ArchiveDocAttribute drop constraint FK_ArchiveDocAttribute_ArchiveDoc
    go--删除主键约束
    alter table ArchiveDoc drop constraint PK_ArchiveDocTable
    go
    alter table ArchiveDoc drop column DM1_ArchiveDocID
    goexec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
    go
      

  3.   

    现在错误 如下:
    服务器: 消息 3733,级别 16,状态 2,行 6
    约束 'FK_ArchiveDocAttribute_ArchiveDoc' 不属于表 'ArchiveDocAttribute'。
    服务器: 消息 3727,级别 16,状态 1,行 6
    未能除去约束。请参阅前面的错误信息。
    服务器: 消息 3725,级别 16,状态 1,行 3
    约束 'PK_ArchiveDocTable' 正由表 'ArchiveDocBaseAttribute' 的外键约束 'FK_ArchiveDocAttribute_ArchiveDoc' 引用。
    服务器: 消息 3727,级别 16,状态 1,行 3
    未能除去约束。请参阅前面的错误信息。
    服务器: 消息 5074,级别 16,状态 8,行 1
    对象 'PK_ArchiveDocTable' 依赖于 列 'DM1_ArchiveDocID'。
    服务器: 消息 5074,级别 16,状态 1,行 1
    对象 'FK_ArchiveDocAttribute_ArchiveDoc' 依赖于 列 'DM1_ArchiveDocID'。
    服务器: 消息 4922,级别 16,状态 1,行 1
    ALTER TABLE DROP COLUMN DM1_ArchiveDocID 失败,因为有一个或多个对象访问此列。
    服务器: 消息 15335,级别 11,状态 1,过程 sp_rename,行 342
    错误: @newname 值 'DM1_ArchiveDocID' 已用作 COLUMN 名称,该值将导致重复,而这是不允许的。我也想想。
      

  4.   

    --看来都得写代码了alter table ArchiveDoc add id_bak bigint NULL 
    goupdate ArchiveDoc set id_bak=DM1_ArchiveDocID
    go--删除外键约束
    declare tb cursor local for
    select s='alter table ['+c.name+'] drop constraint ['+b.name+']'
    from sysforeignkeys a
    join sysobjects b on b.id=a.constid
    join sysobjects c on c.id=a.fkeyid
    join syscolumns d on d.id=c.id and a.fkey=d.colid
    join sysobjects e on e.id=a.rkeyid
    join syscolumns f on f.id=e.id and a.rkey=f.colid 
    where e.name='ArchiveDoc' and f.name='DM1_ArchiveDocID'declare @s varchar(8000)
    open tb
    fetch next from tb into @s
    while @@fetch_status=0
    begin
    exec(@s)
    fetch next from tb into @s
    end
    close tb
    deallocate tb
    go--删除主键约束
    alter table ArchiveDoc drop constraint PK_ArchiveDocTable
    goalter table ArchiveDoc drop column DM1_ArchiveDocID
    goexec sp_rename 'ArchiveDoc.id_bak','DM1_ArchiveDocID','COLUMN'
    go