在SQL Server中,我们可以使用sp_name这个系统存储过程重命名数据库中对象的名称。 此对象可以是表、 索引、 列、 别名,约束等数据类型(具体可以参考官方文档)。上周在使用这个函数重构数据库中约束的时候,遇到了下面错误,如下所示:

USE AdventureWorks2014;

GO

sp_rename 'ErrorLog.DF_ErrorLog_ErrorTime', 'DF_ErrorLog_ErrorTime_old';

GO

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 437

No item by the name of 'ErrorLog.DF_ErrorLog_ErrorTime' could be found in the current database 'AdventureWorks2014', given that @itemtype was input as '(null)'.

注意:重命名约束时,不能在约束前面加上表对象。正确的方式为:前面不要加上表名对象,如下所示

USE AdventureWorks2014;

GO

sp_rename 'DF_ErrorLog_ErrorTime', 'DF_ErrorLog_ErrorTime_old';

GO

对于默认约束、外键约束、检查约束的重命名,都是这种规则。但是对于主键约束,下面两种方式都OK,这个是非常纳闷的一件事情

USE AdventureWorks2014;

GO

sp_rename 'PK_ErrorLog_ErrorLogID', 'PK_ErrorLog_ErrorLogID_OLD'

USE AdventureWorks2014;

GO

sp_rename  'ErrorLog.PK_ErrorLog_ErrorLogID','PK_ErrorLog_ErrorLogID_OLD'

另外,对于HumanResources.Employee这个表,如果要重命名约束CK_Employee_BirthDate,如果使用下面这种方式也会遇到这种错误:

sp_rename 'CK_Employee_BirthDate', 'CK_BirthDate';

GO

正确的方式为:

-- Rename a check constraint.

sp_rename 'HumanResources.CK_Employee_BirthDate', 'CK_BirthDate';

GO

也就是说必须加上对应约束的schema,否则就会提示找不到这个对象(因为约束位于HumanResources下面)。至于为什么约束可以不加表对象名称,那是因为在数据库中,约束的命名是全局唯一的。所以不需要加上表名。其实官方资料已经详细说了:

[ @objname = ] 'object_name'

用户对象或数据类型的当前限定或非限定名称。 

如果要重命名的对象是表中的列object_name必须在窗体table.columnschema.table.column 中使用 如果要重命名的对象的索引object_name必须在窗体table.indexschema.table.index 如果要重命名的对象是一个约束object_name必须在窗体schema.constraint

 

 

-- item type determined?

if (@objtype is null)

begin

COMMIT TRANSACTION

raiserror(15225,-1,-1,@objname, @CurrentDb, @objtypeIN)

return 1

end

 

 

参考资料:

https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-2017

SQL Server使用sp_rename重命名约束注意事项的更多相关文章

  1. SQL Server ->> 存储过程sp_rename重命名数据对象

    1) 表转移Schema和重命名表 ALTER SCHEMA Stage TRANSFER dbo.Stage_AAA; EXEC sp_rename 'Stage.Stage_AAA', 'AAA' ...

  2. SQL Server 2008数据库重命名方法

    假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...

  3. 【转】SQL SERVER 中 sp_rename 用法

    因需求变更要改表的列名,平常都是跑到Enterprise manager中选取服务器->数据库->表,然后修改表,这样太麻烦了,查了一下,可以用script搞定,代码如下: EXEC sp ...

  4. SQL SERVER 中 sp_rename 用法

    转自:http://www.cnblogs.com/no7dw/archive/2010/03/04/1678287.html 因需求变更要改表的列名,平常都是跑到Enterprise manager ...

  5. SQL Server 连接问题-命名管道

    原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 ...

  6. MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异

    MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...

  7. SQL Server 数据库设计、命名、编码规范

    https://blog.csdn.net/songguozhi/article/details/5858159 SQL Server 数据库设计.命名.编码规范

  8. Microsoft SQL Server学习(四)--约束

    SQLServer - 约束 主要是为了保证数据库中的数据一致性.有效性.准确性, 从而提高了数据库中数据的正确性 一.约束的分类 在SQLserver中,约束分三种不同类型 1.实体约束 实提约束是 ...

  9. Sql Server 主键 外键约束

    主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...

随机推荐

  1. PAT1120: Friend Numbers

    1120. Friend Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Two in ...

  2. 解决Kali用户名密码正确但是无法登陆的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=684 前言: 用户名和密码都正确,但是登陆Kali的时候总是提示用户名或密码错误,无法登陆,本文介绍一种解决办法. ...

  3. linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)

    本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...

  4. Day4 《机器学习》第四章学习笔记

    决策树 前几天学习了<机器学习>的前三章,前三章介绍机器学习的基础知识,接下来,第四章到第十章介绍一些经典而常用的机器学习方法,这部分算是具体的应用篇,第四章介绍了一类机器学习方法——决策 ...

  5. 产品 vs 服务,见识,耐心

    站在空无一人略有冷意的街头,突然有种恍如隔世的感觉:这就是传说中橘生淮北则为枳的淮北?咦,我为什么会出现在这里? 于是我陷入了深深的思考. 关于对过去的思考 托尔斯泰说过:幸福的家庭是相似的,不幸的家 ...

  6. 有趣的toggleClass实现交替样式

    addClass和removeClass进行样式类型的修改相信比较容易学习和接受 但是用这两个方法去实现交替样式,像一些<li>列表的样式,还有同类型数据的呈现, 当然很多框架都给出了封装 ...

  7. MySQL如何优化

    对于全栈而言,数据库技能不可或缺,关系型数据库或者nosql,内存型数据库或者偏磁盘存储的数据库,对象存储的数据库或者图数据库--林林总总,但是第一必备技能还应该是MySQL.从LAMP的兴起,到Ma ...

  8. 根据http协议下载文件保存到相应的文件下

    本实例通过提供的http网址来下载文件,并保存到本地指定的文件下. 本例提供的网址为:http://112.53.80.131:8888/database/11.mdb,下载的文件名为:11.mdb ...

  9. 使用istream迭代器来输入输出数据

    在C++中,很多人都会选择使用cin来进行数据的输入,使用cout来进行数据的输出,现在在C++11中我们可以使用iostream迭代器来进行这些操作,这会减少代码量,达到的效果和前面两种相同.以下是 ...

  10. java技术树+必读书籍

    引子 本篇文章用技术树的形式来展示java相关技术栈.所有技术点有博客的都自带链接,没有的后续加上. 必读书籍推荐: 1.java基础: <effective java>-->四星推 ...