我创建了一个像这样的全局临时表 -
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';
答案 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);