--假设id为标识种子
alter table tablename add id1 int
update tablename set id1=id
alter table tablename drop column id
exec sp_rename 'tablename.id1','id'
alter table tablename add id1 int
update tablename set id1=id
alter table tablename drop column id
exec sp_rename 'tablename.id1','id'
--有表
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
如果是新建表好说,按字段的顺序排列就行了
如果向已有表里加字段,而且还不是加在最后,比较麻烦,建议你到SQL SERVER企业管理器里
利用表设计功能,选中某一列,右键-》插入列....
加标识有数据的话
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
老大,如果用SQL SERVER企业管理器,我还用问吗?
是要用SQL语句实现啊?
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
或先保存表中的数据,删除表,新建表,再将数据导回来!
这种方法,有个缺点就是,当要修改的表有外键约束就比较麻烦.
还要先删除外键约束!
还需要做什么设置吗?你的存储过程我执行后表就打不开了啊?
错误:
加载到内存的表具有一种无法识别的用户定义类型
exec addcolumn '表名','新列名','新列类型',加到第几个位置
我的是:
exec addcolumn 'yao','id2','int',2再执行 select * from yao 错误:
SqlDumpExecptionHandler:进程55发生了严重异常c0000005 EXCEPTION_ACCESS_VIOLATION.
----------
新增列的位置,不能是任何位置!
当表中的列上有pk,fk等其他完整性约束时时,只修改 syscolumns 表
而不修改 sysindexes 和 sysindexkeys 等其他系统表!
后果很糟糕!