最近遇到一个问题,一个数据库中有很多相近的表,已经有数据了,但是需要把主键修改为自动增长的,但是又不想删除数据,只好先删掉主键,然后再添加主键并设置自动增长。
因为这几个表的主键名字是相同的,都是“KKKKKK”,我想用循环来实现,于是写了个存储过程,主要使用游标。
- 首先,查询表名称,主要通过sysObjects这个系统表
- 查询表的主键约束
- 删除主键约束
- 删除主键
- 添加主键并设置自动增长
以上就是基本思路,剩下的就是循环了,sql server只有while循环,可以用游标来读取sql查询结果,代码如下:
BEGIN
DECLARE @tableName varchar(100);
DECLARE test_curse CURSOR FAST_FORWARD FOR
select name from sysobjects where type='u' and name like 'B[_]__';
OPEN test_curse;
FETCH NEXT FROM test_curse INTO @tableName;
WHILE @@fetch_status=0
BEGIN
declare @PK varchar(100) ;
select @PK=name from sysobjects where xtype='PK' and parent_obj=object_id(@tableName);
PRINT @PK;
exec ('alter table '+ @tableName+' drop CONSTRAINT '+@PK);
EXEC('alter table '+ @tableName+' drop column KKKKKK');
EXEC('ALTER TABLE '+ @tableName+' ADD KKKKKK DECIMAL(32) IDENTITY(1,1) PRIMARY KEY');
FETCH NEXT FROM test_curse INTO @tableName;
END;
CLOSE test_curse;
DEALLOCATE test_curse;
END