在数据库表中指定位置添加新列

时间:2022-07-09 14:50:30
用alter table table_name add column_name Data_type not null...可以实现添加新列。但是这个只是在最末尾添加。
现在我想如果在任意列之前或之后添加新列,该怎么写SQL呢?
谢谢。

11 个解决方案

#1



create proc addcolumn
@tablename varchar(30),  --表名
@colname varchar(30),    --要加的列名
@coltype varchar(100),   --要加的列类型
@colid int               --加到第几列
as

declare @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 'test','id2','char(10)',2
表示将id2这个列加到表test的第二个位置,类型是char(10)。

#2


/*
强烈建议不要使用这种方法!
不安全!
因为过程只修改这一个syscolumns系统表!
而不去修改,sysindexes,sysconstraints等
其他系统表!这些是和表的列关联的信息!

*/
--例如
create table add_column(col1 int,col2 int ,col3 int)
go
create index col3_ind on add_column (col3)
go
sp_helpindex add_column

exec addcolumn 'add_column','colx','char(10)',3

sp_helpindex add_column
/*
新增前
index_name  index_description              index_keys
----------- ------------------------------ ----------
col3_ind   nonclustered located on PRIMARY  col3

新增后
index_name  index_description              index_keys
----------- ------------------------------ ----------
col3_ind   nonclustered located on PRIMARY  colx
*/

#3


最好的办法还是在企业管理器中拖到适当位置。

#4


同意楼上的! :D

#5


shuiniu(飞扬的梦):你能把你这种方法说一下吗?我很不明白的样子...

#6


事实是这个样子的:我们是做系统维护的,可能需要新增一些table的栏位。新增后,提交给User的应该是可执行的SQL语句,而不能让用户也到企业管理器里面作业,这对用户来说很不方便的。所以才会有上面的问题来问大家。

#7


1.
建一个同结构的临时表!
select * into #temp from 表
2.如果表有外键关联,删掉
alter table 表 drop constraint 外键名
3.删除表 drop table 表
4.建立新表 create table 表(....新增列.....)
5.导入数据
insert 表 select ..新增列的默认值或是空值.. from #temp
6.将第2步删除的关系再建立起来!
alter table 表 add constraint ....
还有一些被删除的索引啊,等等!

#8


个人认为应该最好不要直接修改系统表数据信息,可使用下列语句实现:
alter table table_name add (column_name1 Data_type not null before column_name2)
功能说明:表table_name已存在字段column_name2之前增加字段column_name1,字段属性由data_type说明,其中not null 为任选项。

#9


alter table table_name add (column_name1 Data_type not null before column_name2)
--------------
有这语法吗?????

#10


如果表里没有数据,直接重建就可以拉。
否则,先建一个新表,包含原表的所有字段和你新加的字段,然后把源表数据倒入到
新表中,加上关联,索引。最后delete掉你的旧表就好了

#11


如果可以用企业管理器,那就推荐用企业管理器,方便安全。

#1



create proc addcolumn
@tablename varchar(30),  --表名
@colname varchar(30),    --要加的列名
@coltype varchar(100),   --要加的列类型
@colid int               --加到第几列
as

declare @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 'test','id2','char(10)',2
表示将id2这个列加到表test的第二个位置,类型是char(10)。

#2


/*
强烈建议不要使用这种方法!
不安全!
因为过程只修改这一个syscolumns系统表!
而不去修改,sysindexes,sysconstraints等
其他系统表!这些是和表的列关联的信息!

*/
--例如
create table add_column(col1 int,col2 int ,col3 int)
go
create index col3_ind on add_column (col3)
go
sp_helpindex add_column

exec addcolumn 'add_column','colx','char(10)',3

sp_helpindex add_column
/*
新增前
index_name  index_description              index_keys
----------- ------------------------------ ----------
col3_ind   nonclustered located on PRIMARY  col3

新增后
index_name  index_description              index_keys
----------- ------------------------------ ----------
col3_ind   nonclustered located on PRIMARY  colx
*/

#3


最好的办法还是在企业管理器中拖到适当位置。

#4


同意楼上的! :D

#5


shuiniu(飞扬的梦):你能把你这种方法说一下吗?我很不明白的样子...

#6


事实是这个样子的:我们是做系统维护的,可能需要新增一些table的栏位。新增后,提交给User的应该是可执行的SQL语句,而不能让用户也到企业管理器里面作业,这对用户来说很不方便的。所以才会有上面的问题来问大家。

#7


1.
建一个同结构的临时表!
select * into #temp from 表
2.如果表有外键关联,删掉
alter table 表 drop constraint 外键名
3.删除表 drop table 表
4.建立新表 create table 表(....新增列.....)
5.导入数据
insert 表 select ..新增列的默认值或是空值.. from #temp
6.将第2步删除的关系再建立起来!
alter table 表 add constraint ....
还有一些被删除的索引啊,等等!

#8


个人认为应该最好不要直接修改系统表数据信息,可使用下列语句实现:
alter table table_name add (column_name1 Data_type not null before column_name2)
功能说明:表table_name已存在字段column_name2之前增加字段column_name1,字段属性由data_type说明,其中not null 为任选项。

#9


alter table table_name add (column_name1 Data_type not null before column_name2)
--------------
有这语法吗?????

#10


如果表里没有数据,直接重建就可以拉。
否则,先建一个新表,包含原表的所有字段和你新加的字段,然后把源表数据倒入到
新表中,加上关联,索引。最后delete掉你的旧表就好了

#11


如果可以用企业管理器,那就推荐用企业管理器,方便安全。