无法重命名临时表的列

Hap*_*der 9 sql sql-server sql-server-2005 sql-server-2008

我创建了一个这样的全局临时表 -

CREATE TABLE ##BigTable
(Nos varchar(10) null)
Run Code Online (Sandbox Code Playgroud)

然后尝试重命名Nos列,如下所示 -

EXEC sp_RENAME '##BigTable.Nos' , 'Numbers', 'COLUMN'
Run Code Online (Sandbox Code Playgroud)

我收到了错误 -

Either the parameter @objname is ambiguous or the 
claimed @objtype (COLUMN) is wrong.
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该如何解决这个问题呢?



EXTRA与问题不完全相关的东西,但供参考.

我想添加这个 - 我尝试使用像这样的完全限定名称创建全局临时表 -

CREATE TABLE [NotMyTempDataBase].[dbo].[##BigTable]
(Nos varchar(10) null)
Run Code Online (Sandbox Code Playgroud)

然后,我尝试使用 - 重命名它 -

EXEC tempdb.sys.sp_rename N'[NotMyTempDataBase].[dbo].[##BigTable].Nos', 
N'Numbers', N'COLUMN';
Run Code Online (Sandbox Code Playgroud)

错误 -限定的@oldname引用当前数据库以外的数据库.

这是错的.我意识到临时表是在系统数据库tempdb中创建的,即使您在创建它时指定了另一个DB名称.

改用它 -

CREATE TABLE [tempdb].[dbo].[##BigTable]
(Nos varchar(10) null)
Run Code Online (Sandbox Code Playgroud)

--SQL服务器消息:忽略数据库名称'tempdb',引用tempdb中的对象.

EXEC tempdb.sys.sp_rename N'[tempdb].[dbo].[##BigTable].Nos', 
N'Numbers', N'COLUMN';
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 19

好的,所以实际的解决方案是:

EXEC tempdb.sys.sp_rename N'##BigTable.Nos', N'Numbers', N'COLUMN';
Run Code Online (Sandbox Code Playgroud)

由于#temp表(甚至是##全局临时表)存在tempdb,您需要在sp_rename那里调用.

但需要考虑的其他问题:

  • 为什么你在使用##全局临时表?你知道这有效地将并发限制为ONE,对吗?当两个用户同时调用此代码时,您认为会发生什么?可能你想在这里使用#local临时表,或者完全避免使用#temp表.

  • 为什么需要在脚本中途更改列名?首先将其命名为正确,或者继续引用旧名称.以后脚本如何知道你改变了名字?出于什么目的?

  • N应该针对您传递给SQL Server的每个Unicode字符串加上前缀.这避免了很多情况下的隐式转换,以及其他情况下的数据丢失.由于所有元数据都处理Unicode,因此请始终使用N来添加涉及元数据的字符串.请参阅[此问题](http://stackoverflow.com/questions/10025032/what-is-the-meaning-of-the-prefix-n-in-t-sql-statements)和[此问题](http ://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar)了解更多细节我不想在评论中重复. (2认同)