现在我想如果在任意列之前或之后添加新列,该怎么写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
*/
强烈建议不要使用这种方法!
不安全!
因为过程只修改这一个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 ....
还有一些被删除的索引啊,等等!
建一个同结构的临时表!
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 为任选项。
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掉你的旧表就好了
否则,先建一个新表,包含原表的所有字段和你新加的字段,然后把源表数据倒入到
新表中,加上关联,索引。最后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
*/
强烈建议不要使用这种方法!
不安全!
因为过程只修改这一个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 ....
还有一些被删除的索引啊,等等!
建一个同结构的临时表!
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 为任选项。
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掉你的旧表就好了
否则,先建一个新表,包含原表的所有字段和你新加的字段,然后把源表数据倒入到
新表中,加上关联,索引。最后delete掉你的旧表就好了
#11
如果可以用企业管理器,那就推荐用企业管理器,方便安全。