今天有个暂时任务,改动生产环境的数据库表名和字段名。曾经要改动表名字段名都是在开发环境。直接打开
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>
keyword:数据库 改动表名 改动列名 改动属性类型
sp_rename