表上创建好了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 ON
- set QUOTED_IDENTIFIER ON
- go
- -- =============================================
- -- Author: Yew
- -- Create date: 2011-06-12
- -- Description: 为某表设置IDENTITY(on ID)
- -- =============================================
- ALTER PROCEDURE [TOOL].[sp_Table_SetIdentity]
- @Table varchar(100)
- ,@Schema varchar(100)
- AS
- BEGIN
- DECLARE @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#] ADD CONSTRAINT [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
----献上代码--------------------------------------
===== by 鬼谷子@魔教=========================
本文转自DavyYew 51CTO博客,原文链接: http://blog.51cto.com/davyyew/586939,如需转载请自行联系原作者