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