无法重命名临时表的列

11

我创建了一个全局临时表,如下所示 -

CREATE TABLE ##BigTable
(Nos varchar(10) null)

然后尝试像这样重命名Nos列-

EXEC sp_RENAME '##BigTable.Nos' , 'Numbers', 'COLUMN'

我遇到了一个错误 -

Either the parameter @objname is ambiguous or the 
claimed @objtype (COLUMN) is wrong.
为什么会发生这种情况,我应该如何解决这个问题?

与问题不完全相关的额外信息,供参考。

我想补充一下 - 我尝试使用完全限定名称创建全局临时表,像这样 -

CREATE TABLE [NotMyTempDataBase].[dbo].[##BigTable]
(Nos varchar(10) null)

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

EXEC tempdb.sys.sp_rename N'[NotMyTempDataBase].[dbo].[##BigTable].Nos', 
N'Numbers', N'COLUMN';

错误 - @oldname 引用的数据库与当前数据库不同。

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

请改用以下内容 -

CREATE TABLE [tempdb].[dbo].[##BigTable]
(Nos varchar(10) null)

--SQL Server消息:数据库名称“tempdb”被忽略,引用了tempdb中的对象。

EXEC tempdb.sys.sp_rename N'[tempdb].[dbo].[##BigTable].Nos', 
N'Numbers', N'COLUMN';

1
顺便问一下,出于好奇,您真的要将数字存储在 varchar 列中吗?如果是这样,为什么? - Andriy M
1
@AndriyM - 不,那只是一个示例,用来说明问题。 - HappyCoder
2个回答

41

好的,那么实际解决方案是:

EXEC tempdb.sys.sp_rename N'##BigTable.Nos', N'Numbers', N'COLUMN';

由于 #temp 表(即使是 ##global temp table)保存在 tempdb 中,你需要在那里调用 sp_rename

但还有进一步的问题需要考虑:

  • 为什么你要使用 ##global temp table?你知道这会有效地将并发性限制为一个,对吧?当两个用户同时调用此代码时,你认为会发生什么?也许你应该在这里使用 #local temp table,或者完全避免使用 #temp tables。

  • 为什么你需要在脚本中间更改列名?要么一开始就命名正确,要么保留引用旧名称。脚本后面如何知道你已更改名称?出于什么目的?


谢谢。我也尝试过不加N。除了防止在解析##时出现某些问题之外,这里的N有什么作用呢? - HappyCoder
3
每次将Unicode字符串传递给SQL Server时,都应该在前面加上N。这可以避免许多情况下的隐式转换和其他情况下的数据丢失。由于所有元数据都涉及Unicode,因此始终使用N来为涉及元数据的字符串添加前缀。请参阅 此问题此问题 获取更多详细信息,我不想在评论中重复。 - Aaron Bertrand
回答你的问题 - 我只是为了学习临时表而这样做。目前,像并发性这样的事情对我来说并不是一个问题。但是,了解相关问题也是很好的。谢谢。 - HappyCoder
我见过的另一种方法是在开始时这样说:USE tempdb; GO - charles ross

-1

另外,这对我有用。它可能对某人有帮助。

EXEC tempdb.sys.sp_rename N'#Tab1.Info', N'Numbers', N'COLUMN';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接