/*–将表中的某个字段转换成标识字段,并保留原来的值
注意,因为要删除原表,所以,如果表和其他表的关联,这些关联要重新创建
–邹建 2003.12–*/
/*–调用示例
exec p_setid 表名,要转换的字段名
–*/
if exists (select * from dbo.sysobjects where id = object_id(n[dbo].[p_setid]) and objectproperty(id, nisprocedure) = 1)
drop procedure [dbo].[p_setid]
go
create proc p_setid
@tbname sysname, –要处理的表名
@fdname sysname –要转换为标识字段的字段名
as
declare @s1 varchar(8000),@s2 varchar(8000),@tmptb sysname
select @s1=,@s2=,@tmptb=[tmp_+@tbname+_bak]
select @s1=@s1+,[+name+]
+case name when @fdname then =identity(bigint,1,1) else end
,@s2=@s2+,[+name+]
from syscolumns where object_id(@tbname)=id
select @s1=substring(@s1,2,8000),@s2=substring(@s2,2,8000)
exec(select top 0 +@s1+ into +@tmptb+ from [+@tbname+]
set identity_insert +@tmptb+ on
insert into +@tmptb+(+@s2+) select +@s2+ from [+@tbname+]
set identity_insert +@tmptb+ off
)
exec(drop table [+@tbname+])
exec sp_rename @tmptb,@tbname
go
/*==========================================================*/
–使用测试
–创建测试的表
create table 表(编号 bigint,姓名 varchar(10))
insert into 表
select 1,张三
union all select 2,李四
union all select 4,王五
go
–调用存储过程,将编号字段改为标识字段
exec p_setid 表,编号
go
–显示处理结果
select * from 表
–显示是否修改成功
select name from syscolumns
where object_id(表)=id and status=0x80
go
–删除测试
drop table 表
