【问题标题】:Cannot rename the column of a temp table无法重命名临时表的列
【发布时间】:2014-01-30 19:06:59
【问题描述】:

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

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 服务器消息:忽略数据库名称“tempdb”,引用 tempdb 中的对象。

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

【问题讨论】:

  • 顺便说一句,出于好奇,您真的要将数字存储在varchar 列中吗?如果有,为什么?
  • @AndriyM - 不。这只是演示问题的一个例子。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

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

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

由于#temp 表(甚至是##global 临时表)位于tempdb,您需要在那里调用sp_rename

但需要考虑的其他问题:

  • 到底为什么要使用##global 临时表?您知道这实际上将并发限制为 ONE,对吧?当两个用户同时调用此代码时,您认为会发生什么?可能您想在这里使用#local 临时表,或者完全避免使用#temp 表。

  • 为什么需要在脚本中途更改列名?要么首先正确命名,要么继续引用旧名称。剧本后来怎么知道你改了名字?目的是什么?

【讨论】:

  • 谢谢。我也试过没有N。 N 这里的目的是什么,除了防止解析 ## 时出现某种问题?
  • N 应该作为您曾经传递给 SQL Server 的每个 Unicode 字符串的前缀。这避免了很多情况下的隐式转换,以及其他情况下的数据丢失。由于所有元数据都处理 Unicode,因此始终使用 N 为涉及元数据的字符串添加前缀。请参阅this questionthis question 了解更多详细信息,我不想在评论中重复。
  • 回答您的问题 - 我这样做只是为了了解临时表。目前,并发之类的事情对我来说不是问题。但是,也很高兴了解相关问题。谢谢。
  • 我见过的另一种方法是在说明时这样说:USE tempdb;去
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 2022-11-03
    • 1970-01-01
    • 2015-02-26
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多