给表增加一个列的时候,怎么指定位置

yuanweiqi 2005-04-15 09:34:32
alter table tbname add colname type
这样做的时候,加的列出现表的最后面,怎么控制出现在固定位置,


alter table tribetax add TribeID int default 0
go
declare @ColID int
update tribetax set TribeID=0
set @ColID = object_id('tribeTax')
update syscolumns set colid = colid + 1 where id=@ColID and Name<>'logID' and Name<>'TribeID'
update syscolumns set colid = 2 where id=@ColID and Name='TribeID'
go
go
类似这样的语句,似乎可以做到,但是提示:
未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作。

请问怎么解决?
...全文
1120 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingfzp 2005-04-26
  • 打赏
  • 举报
回复
to sensorcsdn(sensor) :
你的方法可以,但有个问题,当@colid不是默认值时(如指定@colid=1时),怎么插入的那一列会有值的(如字段类型是INT时,好像是一些莫名其妙的值),应该为NULL值才对呀?
pingfzp 2005-04-26
  • 打赏
  • 举报
回复
好,收藏
lengxiaowei 2005-04-26
  • 打赏
  • 举报
回复
服务器属性-服务器设置-允许对系统目录直接进行修改(打上钩就可以更新系统文件)
chenqianlong 2005-04-19
  • 打赏
  • 举报
回复
xue
talantlee 2005-04-19
  • 打赏
  • 举报
回复
樓主調試通過了沒?通過就說一聲,我也想學
yugang1219 2005-04-16
  • 打赏
  • 举报
回复
收藏先
sensorcsdn 2005-04-16
  • 打赏
  • 举报
回复
--开启系统表写功能,不然无法创建存储过程
exec sp_configure 'allow updates',1 reconfigure with override
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_addfield]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_addfield]
GO

/*--在指定位置添加字段

添加字段到表中的指定位置
注意,字段定义必须符合 alter table add ...的规定
插入的位置从0开始,到字段数目-1结束
如果超过这个范围,则在表的尾部添加字段
一次只能添加一个字段,和 alter table 的限制完全一样
/*--使用示例
--测试表
create table tb(a int)

--添加字段
exec p_addfield 'tb','id int',0 --在最前面添加字段
exec p_addfield 'tb','id1 int',0
exec p_addfield 'tb','id2 int',2 --在第2个字段前面添加字段

--显示添加结果
select * from tb

--删除测试
drop table tb
--*/
create proc p_addfield
@tbname sysname,
@fd_define nvarchar(1000), --字段定义(必须是合法的字段定义)
@colid int=-1 --添加位置:0--fieldcount-1,0表示在第一个字段前插入,-1或效的colid表示插入在最后
as
declare @s nvarchar(4000)

if isnull(objectproperty(object_id(@tbname),'IsUserTable'),0)=0
begin
select 错误='无效的表名'
return
end

--添加字段
set @s='alter table ['+replace(@tbname,']',']]')+'] add '+@fd_define
exec(@s)

--如果是添加在所有字段的未尾,则直接返回即可
if not exists(select 1 from syscolumns where id=object_id(@tbname) and colid between 1 and @colid+1)
return

--开启系统表写开关
exec sp_configure 'allow updates',1 reconfigure with override

set xact_abort on
begin tran
update syscolumns set colid=colid+1
where id=object_id(@tbname)
and colid>@colid

update syscolumns set colid=@colid+1
where id=object_id(@tbname)
and colid=(
select max(colid) from syscolumns
where id=object_id(@tbname))
commit tran

--关闭系统表写开关
exec sp_configure 'allow updates',0 reconfigure with override
go


--关闭系统表写功能
exec sp_configure 'allow updates',0 reconfigure with override
go
select 最后一次操作所影响的记录数=@@rowcou
WangZWang 2005-04-15
  • 打赏
  • 举报
回复
alter table tribetax add TribeID int default 0
go
sp_configure 'allow updates',1 --设置它为1即可修改系统表
go
..............
..............
go

sp_configure 'allow updates',0
lin_now 2005-04-15
  • 打赏
  • 举报
回复
对头!~企业管理器--表设计--把字段向上拖一下不就OK了么?
friendliu 2005-04-15
  • 打赏
  • 举报
回复
在企业管理器中调整位置比较方便些
用SQL语句比较麻烦

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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