--引用班主邹建:sql server不支持在自增列与非自增列之间进行转换.
(楼主可以观察一下企业管理器中这种调整的处理, 它也无法用alter 语句直接完成)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_DropIDENTITY]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_DropIDENTITY]
GO/*--标识列转换为普通列采用修改标识列名,然后按新规则重列的方法处理
只适用于标识列没有与其他对象有关联的表
转换后,列的相关对象也不会恢复
有一定的局限性,仅供参考--邹建 2005.05(引用请保留此信息)--*//*--调用示例EXEC p_DropIDENTITY 'tb'
--*/
CREATE PROC p_DropIDENTITY
@TableName sysname --要处理的表名
AS
IF ISNULL(OBJECTPROPERTY(OBJECT_ID(@TableName),N'IsUserTable'),0)=0
BEGIN
RAISERROR('"%s" 必须是当前数据库中已经存在的用户表',12,16,@TableName)
RETURN
END--标识列转换处理检查
DECLARE @s nvarchar(1000),@FieldName sysname,@bkFieldName sysname,@sql nvarchar(4000)
SELECT @FieldName=QUOTENAME(c.name),
@bkFieldName=CAST(NEWID() as char(36)),
@s=@FieldName+N' '+QUOTENAME(t.name)
+CASE WHEN t.name LIKE '%int' THEN N''
ELSE N'('+CAST(c.prec as varchar)
+N','+CAST(c.scale as varchar)+N')'
END
FROM sysobjects o,syscolumns c,systypes t
WHERE o.name=@TableName
AND o.id=c.id
AND c.xusertype=t.xusertype
AND c.status=0x80
IF @@ROWCOUNT=0
BEGIN
RAISERROR(N'表 "%s" 中无标识列',1,16,@TableName)
RETURN
END--修改标识列名
SET @sql=QUOTENAME(@TableName)+N'.'+@FieldName
EXEC sp_rename @sql,@bkFieldName,N'COLUMN'--转换为标识列处理
SELECT @TableName=QUOTENAME(@TableName),
@bkFieldName=QUOTENAME(@bkFieldName)
EXEC('ALTER TABLE '+@TableName+N' ADD '+@s)
EXEC('UPDATE '+@TableName+N' SET '+@FieldName+N'='+@bkFieldName+N'
ALTER TABLE '+@TableName+N' DROP COLUMN '+@bkFieldName)
RAISERROR(N'表 "%s" 中的标识列 "%s" 已经转换为普通列',1,16,@TableName,@FieldName)
GO 
----------------------------------------------------------------/*
把表 "Tb" 里的字段 "ID" 属性改成 "自动编号""Tb"表里以前有数据,"ID"里是数值型的
*/
create table Tb(id int)
go
insert into Tb(id) values(1)
insert into Tb(id) values(10)
insert into Tb(id) values(20)
insert into Tb(id) values(11)begin transaction--创建临时表
create table dbo.temp_Tb (id int not null identity (1, 1)) on [primary]
go
set identity_insert dbo.temp_Tb on
go--向临时表中插入数据
if exists(select * from dbo.Tb)
exec('insert into dbo.temp_Tb (id) select id from dbo.Tb tablockx')
go
set identity_insert dbo.temp_Tb off
go--删除原表
drop table dbo.Tb
go--重命名临时表
execute sp_rename 'temp_Tb', 'Tb', 'object'
go
commitdrop table Tb
go
虽然这样处理可以,但是会丢失关系、触发器等等相关对象。
----------------------------------------------------------------可以考虑把原来的ID列Drop掉,用SQL语句增加ID(标识列)