2014-01-30 3 views
4

я создал глобальную временную таблицу, как это -Невозможно переименовать столбец временной таблицы

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

Как в стороне и просто из любопытства вы действительно собираетесь хранить цифры в столбце 'varchar'? Если да, то почему? –

+1

@AndriyM - Нет. Это просто пример, демонстрирующий проблему. – HappyCoder

ответ

10

Ok, так что фактическое решение:

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

Поскольку #temp таблица (даже ## глобальной температуры таблицы) живет в tempdb, вам нужно вызвать sp_rename там.

Но дальнейшие вопросы для рассмотрения:

  • Почему на земле вы используете ## глобальную временную таблицу? Вы знаете, что это эффективно ограничивает параллелизм до ONE, справа? Как вы думаете, что произойдет, когда два пользователя одновременно вызовут этот код? Вероятно, вы хотите использовать таблицу #local temp здесь, или, возможно, вообще избегаете таблиц #temp.

  • Почему у вас есть необходимость изменить имя столбца на полпути через сценарий? Либо назовите его в первую очередь, либо продолжайте ссылаться на старое имя. Как позже этот скрипт узнает, что вы изменили имя? Для чего?

+0

Спасибо. Я тоже пробовал это без N. В чем цель N здесь, кроме того, что она предотвращает какую-то проблему при анализе ##? – HappyCoder

+2

N должен быть префикс для каждой строки Unicode, которую вы когда-либо проходили на SQL Server. Это позволяет избежать неявных преобразований во многих случаях и потери данных в других. Поскольку все метаданные имеют дело с Unicode, всегда используйте N для префикса строк, которые включают метаданные. См. [Этот вопрос] (http://stackoverflow.com/questions/10025032/what-is-the-meaning-of-the-prefix-n-in-t-sql-statements) и [этот вопрос] (http : //stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar) для получения более подробной информации. Я не хочу повторять в комментарии. –

+0

В ответ на ваши вопросы - я только делаю это, чтобы узнать о временных таблицах. На данный момент такие вещи, как параллелизм, не беспокоят меня. Но, его хорошо знать о смежных вопросах тоже. Благодарю. – HappyCoder

Смежные вопросы