今天有个临时任务,修改生产环境的数据库表名和字段名。以前要修改表名字段名都是在开发环境,直接打开
SQL Server找到对应的表或字段重命名就OK啦,可是这是线上数据库,再想直接F2修改是不可能的啦。怎么办?乖
乖写脚本呗。上网了解了一些相关资料,结合我自己操作过程中出现的一些实际问题简单作个总结,再次加深下印
象。
SQL自带了一系列的系统存储过程。其中sp_rename就具有修改表名和列名的功能。对于sp_rename是这样定
义的:更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称。
基本语法
修改表名:EXEC sp_rename ‘[原有表名]’, '[新表名]';
修改列名:EXEC sp_rename ‘[原有列名]’, ‘[新列名]' , 'COLUMN';
百度百科链接
实例讲解
现有数据库testDB,框架体dbo,dbo下有三张表分别为animal(code,name),bird(code,name,animalCode'),cat(code,name,animalCode')
接下来我对这三张表进行如下操作:
修改表名、修改列名、修改属性类型、添加属性
<span style="font-family:Verdana;font-size:18px;">USE testDB GO --将animal表名更改为animalCategory EXEC sp_rename '[dbo].[animal]','animalCategory'; --将bird表中的外键animalCode更改为animalCategoryCode EXEC sp_rename '[dbo].[bird].animalCode','animalCategoryCode','COLUMN'; --将bird表中属性name的类型修改为VARCHAR ALTER TABLE [dbo].[bird] ALTER COLUMN name VARCHAR(20) --向bird表中添加颜色外键 ALTER TABLE [dbo].[bird] ADD colorCode INT NULL GO</span>
注意下面一段脚本执行后抛出异常:
消息 15248,级别 11,状态 1,过程 sp_rename,第 238 行
参数 @objname 不明确或所声明的 @objtype (COLUMN)有误。
<span style="font-family:Verdana;font-size:18px;">USE testDB GO --将cat表名更改为petCat EXEC sp_rename 'cat','petCat'; --将bird表中的外键animalCode更改为animalCategoryCode EXEC sp_rename 'cat.animalCode','animalCategoryCode','COLUMN'; GO</span>
这样看,也没有什么错呀,修改表名、修改列名。再仔细看你就会发现:执行完第一句SQL后cat表已经被重命
名为petCat,所以再次执行第二句SQL的时候就找不到表cat了。
因此如果同时修改表名和字段名要注意修改的先后顺序或者直接记住:先改列后改表
另外还有一点需要注意
我的这一段脚本没有给框架体,即表的限定条件dbo。当不给表限定条件的时候默认为dbo,所以我这里没有报
错。假如现在cat表的限定条件为tmp.cat,那么这段脚本会抛出异常,因为在默认的dbo下找不到cat表。
因此在对表进行操作的时候要养成一个好习惯:随时都带有框架体。
感受
知识点不多,但也是今天的收获,滴水石川。
相比较第一点,这一点收获更重要:清楚的思维逻辑和好的编程习惯!
在执行的SQL语句中还应用到了另外一个存储过程sys.sp_addextendedproperty,作个简单示例。感兴趣的话
可以上网查查。
<span style="font-family:Verdana;font-size:18px;">============================================================= -- 作 者:wyq -- 功 能:学生信息表添加是否是教师子女属性 -- 日 期:2015-7-28 -- 说 明: --学生信息表添加是否是教师子女属性 =============================================================BEGIN TRAN USE BasicService ALTER TABLE dbo.StudentInfo ADD IsToTeacher BIT NULL EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'是否是教师子女', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'StudentInfo', @level2type = N'COLUMN', @level2name = N'IsToTeacher' --COMMIT TRAN</span>
关键字:数据库 修改表名 修改列名 修改属性类型 sp_rename