这样做没有实质意义 需要时候处理吧 --2000 select *,ID=(select count(*) from tb where id<=t.id) from tb t --2005 select *,ID=row_number()over(order by (select 1))from tb
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 --------------------------------------------------------------- 四个步骤: 1、增加一个int类型的列 alter table add xinglie int 2、更新新列的数据为自增列的数据 update tb set xinglie=自增列名 3、删除自增列 alter table tb drop column 自增列 4、更改新列名为原自增列的列名 exec sp_rename N'tb.xinglie','原自增列名',N'column' --------------------------------------------------------------- sp_configure 'Allow update',1 RECONFIGURE WITH OVERRIDE update syscolumns set colstat=0 where colstat=1 and id=object_id('tablename') sp_configure 'Allow update',0 RECONFIGURE WITH OVERRIDE go
需要时候处理吧
--2000
select *,ID=(select count(*) from tb where id<=t.id) from tb t
--2005
select *,ID=row_number()over(order by (select 1))from tb
DBCC CHECKIDENT (表名, RESEED, 1)
方法二:建立临时表,设定一个自增列,然后将数据存放到临时表,然后再导回来
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 --------------------------------------------------------------- 四个步骤:
1、增加一个int类型的列
alter table add xinglie int
2、更新新列的数据为自增列的数据
update tb set xinglie=自增列名
3、删除自增列
alter table tb drop column 自增列
4、更改新列名为原自增列的列名
exec sp_rename N'tb.xinglie','原自增列名',N'column'
--------------------------------------------------------------- sp_configure 'Allow update',1
RECONFIGURE WITH OVERRIDE
update syscolumns set colstat=0 where colstat=1 and id=object_id('tablename')
sp_configure 'Allow update',0
RECONFIGURE WITH OVERRIDE
go