将已有数据的表的[ID]字段变更为自增长 - 面向对象网,数据库,mssql,学习,对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > 数据库 > MSSQL > 正文

将已有数据的表的[ID]字段变更为自增长

来源: www.bianceng.cn 阅读:

表上创建好了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

Tags:
相关文章列表: