敬业的IT人 >> 数据库 >> 其他数据库 >> 将表中字段转换,并保留原值

将表中字段转换,并保留原值

敬业的IT人 互联网 佚名 2008-1-8 16:16:06

  /*--将表中的某个字段转换成标识字段,并保留原来的值

  注意,因为要删除原表,所以,如果表和其他表的关联,这些关联要重新创建

  --邹建 2003.12--*/

  /*--调用示例

  exec p_setid '表名','要转换的字段名'
  --*/

  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_setid]') and OBJECTPROPERTY(id, N'IsProcedure') = 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 表

进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com