如何在有identity属性的字段上去除identity属性,只能用sql语句完成。急!!!!!!
数据库现在一张表a,它有一个字段为[id] int identity(1,1)
我要用sql语句去掉表a id字段的identity属性。
请自位高手指教。十万火急!!!!!!!!!!!!!!!!!!!!!!!!
问题点数:50、回复次数:16Top
1 楼jinjazz(近身剪)回复于 2005-02-28 15:19:43 得分 0
ALTER TABLE 表 ADD 编号1 bigint identity(1,1) not null
go
SET IDENTITY_INSERT 表 ON
go
update tablename set 编号1=编号
go
SET IDENTITY_INSERT 表 OFF
go
ALTER TABLE 表 DROP COLUMN 编号
go
exec sp_rename '表.编号1','编号'
go
Top
2 楼pbsql(风云)回复于 2005-02-28 15:23:21 得分 5
alter table a add xxx int
update a set xxx=id
alter table a drop column id
exec sp_rename 'xxx', 'id', 'column'Top
3 楼bciAnson(Anson)回复于 2005-02-28 15:29:30 得分 0
注意:不能改变id的位置,因为我还要做这样的操作的
insert into a
select * from b
a和b的数据结构是一至的.Top
4 楼tipbase(信口开河)回复于 2005-02-28 16:58:44 得分 0
alter table a alter column id int not nullTop
5 楼bciAnson(Anson)回复于 2005-02-28 17:21:35 得分 0
大家帮个忙再查一下。微软也没有公布过T-SQL是怎么写,只解释用企业管理器怎么做。Top
6 楼pbsql(风云)回复于 2005-02-28 17:26:21 得分 5
只能是新建一列、拷贝数据、删除原列、改列名,但这样会改变id的位置
insert into a select * from b
改为:
insert into a(字段列表)
select 字段列表 from b
Top
7 楼bciAnson(Anson)回复于 2005-02-28 17:43:58 得分 0
这样会晕死的,有44几个字段。我也看了一些老外的贴,他们也没搞到。
一定可以用脚本做的。只是没有公布吧了。
很多时我们想利用现在的数据表动态创建一些表结构相同的表,但往往会有这个问题
select top 1 * into a from aa where 1=0
.......
.......
insert into a
select * from c
这里c跟a结构相同,但因为有identity列,所以失败Top
8 楼yjzhg(执著)回复于 2005-02-28 17:51:18 得分 0
cast(a as varchar(10))Top
9 楼yjzhg(执著)回复于 2005-02-28 17:52:14 得分 5
insert into a
select cast(a as varchar(10)),。。。 from cTop
10 楼bciAnson(Anson)回复于 2005-03-09 17:54:09 得分 0
yjzhg(执著)
============
1.你改了数据类型,不行
2.我想要的是用语句去掉identity属性.
Top
11 楼netcoder(朱二)回复于 2005-03-09 19:25:40 得分 5
试用下面的语句,但不能保证不会有后遗症,所有强烈推荐:
******************
先做好数据库的备份
******************
sp_configure 'allow updates', 1
GO
reconfigure with override
GO
update syscolumns set colstat = colstat & 0x0000
where id=object_id('a') and name='id'
GO
sp_configure 'allow updates', 0
Top
12 楼dxhdxh(anyduan)回复于 2005-03-09 21:58:24 得分 5
ALTER TABLE 表 ADD 编号1 int
go
SET IDENTITY_INSERT 表 ON
go
update tablename set 编号1=编号
go
SET IDENTITY_INSERT 表 OFF
go
ALTER TABLE 表 DROP COLUMN 编号
go
exec sp_rename '表.编号1','编号'
Top
13 楼631799(杭州工人)回复于 2005-03-09 23:15:10 得分 0
select top 1 * into a from c where 1=0
.......
.......
set identity_insert a on
insert into a select * from c
set identity_insert a off
-------------------------------------------------
这样会晕死的,有44几个字段。我也看了一些老外的贴,他们也没搞到。
一定可以用脚本做的。只是没有公布吧了。
很多时我们想利用现在的数据表动态创建一些表结构相同的表,但往往会有这个问题
select top 1 * into a from aa where 1=0
.......
.......
insert into a
select * from c
这里c跟a结构相同,但因为有identity列,所以失败
Top
14 楼631799(杭州工人)回复于 2005-03-09 23:16:57 得分 25
系统表写功能,不然无法创建存储过程
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 的限制完全一样
--邹建 2004.07(引用请保留此信息)--*/
/*--使用示例
--测试表
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
goTop
15 楼bciAnson(Anson)回复于 2005-03-10 20:40:01 得分 0
感谢各位的帮忙,特别感谢 631799(杭州工人)
=========================================
Top
16 楼czjcsdn(葫芦)回复于 2005-04-30 13:16:06 得分 0
netcoder(朱二)
强啊,学到Top




