Welcome

首页 / 数据库 / SQLServer / 将已有数据的表的[ID]字段变更为自增长

将已有数据的表的[ID]字段变更为自增长2013-12-28表上创建好了PK,却发现了更大的麻烦:忘记将[ID] 字段设置成IDENTITY了:(

那可是几百张表哪!那就编写SQL脚本来搞定吧。

可是,这事没有想象中那么容易:ALTER TABLE不支持将某字段变更为IDENTITY (注:MS SQL Mobile是支持此语法的)

而且,若该字段上有PK、Index、Constrains等,必须先删除才能DROP COLUMN.

注:

1)下面的代码只处理了单个表的。整个DB中所有表,或者选择一批表进行处理,是件很容易的事,读者自己搞定吧。

2)这段代码只是示例,作了很多简化与假定:

- 简化:不判断是否存在特定名称的PK;

- 假定:[ID]字段上没有其它约束

- 假定:目标表的PK固定为PK_#Table#,目标字段为[ID]

- 假定:之前的ID数据没有用(否则应该使用Move—>Rebuild-->MoveBack的方式)

----献上代码--------------------------------------

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo-- ============================================= -- Author:Yew -- Create date: 2011-06-12 -- Description: 为某表设置IDENTITY(on ID) -- ============================================= ALTER PROCEDURE [TOOL].[sp_Table_SetIdentity]@Table varchar(100) ,@Schemavarchar(100) ASBEGINDECLARE @vSQL nvarchar(max)-- drop PK on [ID] SET @vSQL = N" ALTER TABLE#Schema#.#Table# DROP CONSTRAINT PK_#Table#; "SET @vSQL = Replace(@vSQL, "#Table#", @Table) SET @vSQL = Replace(@vSQL, "#Schema#", @Schema) print @vSql EXEC (@vSql)-- rebuild IDENTITY column SET @vSQL = N" ALTER TABLE#Schema#.#Table# DROP COLUMN [ID];ALTER TABLE#Schema#.#Table# ADD [ID] int IDENTITY(1, 1) NOT NULL;ALTER TABLE [#Schema#].[#Table#] ADDCONSTRAINT [PK_#Table#] PRIMARY KEY CLUSTERED( [ID] ASC )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, ONLINE = OFF) ON [PRIMARY]; "SET @vSQL = Replace(@vSQL, "#Table#", @Table) SET @vSQL = Replace(@vSQL, "#Schema#", @Schema) print @vSql EXEC (@vSql) END