如何用sql语句去掉一列的标识列属性?

yuyulily 2003-10-16 12:12:51
如题.
或:添加一列时如何控制添加的位置?
...全文
1495 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyulily 2003-10-16
  • 打赏
  • 举报
回复
aierong:
还需要做什么设置吗?你的存储过程我执行后表就打不开了啊?
错误:
加载到内存的表具有一种无法识别的用户定义类型
shuiniu 2003-10-16
  • 打赏
  • 举报
回复
直接用alter table tablename add column name .... 只能添加到表的最后一个字段,
或先保存表中的数据,删除表,新建表,再将数据导回来!
这种方法,有个缺点就是,当要修改的表有外键约束就比较麻烦.
还要先删除外键约束!
aierong 2003-10-16
  • 打赏
  • 举报
回复
在任何位置插入列:
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 'a02','id2','char(10)',2
表示将id2这个列加到表test的第二个位置,类型是char(10)。
select * from a02

yuyulily 2003-10-16
  • 打赏
  • 举报
回复
如果向已有表里加字段,而且还不是加在最后,

就是这样的,有什么办法吗?
老大,如果用SQL SERVER企业管理器,我还用问吗?
是要用SQL语句实现啊?
伍子V5 2003-10-16
  • 打赏
  • 举报
回复
去标识

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 表 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
sdhdy 2003-10-16
  • 打赏
  • 举报
回复
添加一列时如何控制添加的位置?
如果是新建表好说,按字段的顺序排列就行了
如果向已有表里加字段,而且还不是加在最后,比较麻烦,建议你到SQL SERVER企业管理器里
利用表设计功能,选中某一列,右键-》插入列....
zjcxc 元老 2003-10-16
  • 打赏
  • 举报
回复
不能控制,只能整表重建.企业管理器都是这样做法.

例如:
--有表
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


sdhdy 2003-10-16
  • 打赏
  • 举报
回复
--假设id为标识种子
alter table tablename add id1 int
update tablename set id1=id
alter table tablename drop column id
exec sp_rename 'tablename.id1','id'
shuiniu 2003-10-16
  • 打赏
  • 举报
回复
aierong(皑婀瑢-数据库XML.NET联盟会局长) 的方法使用不当就很危险!
----------
新增列的位置,不能是任何位置!
当表中的列上有pk,fk等其他完整性约束时时,只修改 syscolumns 表
而不修改 sysindexes 和 sysindexkeys 等其他系统表!
后果很糟糕!

yuyulily 2003-10-16
  • 打赏
  • 举报
回复
就是按照:
exec addcolumn '表名','新列名','新列类型',加到第几个位置
我的是:
exec addcolumn 'yao','id2','int',2

再执行 select * from yao

错误:
SqlDumpExecptionHandler:进程55发生了严重异常c0000005 EXCEPTION_ACCESS_VIOLATION.

happydreamer 2003-10-16
  • 打赏
  • 举报
回复
过程应该是对的,你如何调用的?
happydreamer 2003-10-16
  • 打赏
  • 举报
回复
过程应该是对的,你如何调用的?

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧