无法重命名临时表的列

时间:2014-01-30 19:07:00

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

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

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.

为什么会发生这种情况?如何解决问题?



EXTRA与问题不完全相关的内容,仅供参考。

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

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';

2 个答案:

答案 0 :(得分:14)

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

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

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

但需要考虑的其他问题:

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

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

答案 1 :(得分:0)

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

CBad* pcbut = (CBad*) GetDlgItem( IDC_MARKCHECK );
pcbut->ModifyStyle(0, BS_OWNERDRAW);